2015-08-12 3 views
1

Je souhaite créer un fichier contenant plusieurs signatures indépendantes référençant les mêmes données. Je veux que les données soient stockées dans le fichier XML de sortie, en tant que frères et soeurs à ds:Signature éléments, comme ci-dessous (uniquement avec plusieurs ds:Signature éléments):Signature interne détachée XAdES

<?xml version="1.0" encoding="UTF-8"?> 
<internally-detached> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo> 
     <ds:CanonicalizationMethod 
     Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     <ds:SignatureMethod 
     Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <ds:Reference URI="#data"> 
     <ds:DigestMethod 
      Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <ds:DigestValue/> 
     </ds:Reference> 
    </ds:SignedInfo> 
    <ds:SignatureValue/> 
    </ds:Signature> 

    <document Id="data"> 
    <title>title</title> 
    <author>writer</author> 
    <date>today</date> 
    <content> 
     <para>First paragraph</para> 
     <para>Second paragraph</para> 
    </content> 
    </document> 
</internally-detached> 

Source: https://msdn.microsoft.com/en-us/library/ms759193(v=vs.85).aspx (je suis conscient que le site ne mentionne pas la norme XAdES).

J'ai essayé d'appliquer à une signature XAdES enveloppants valide et mettre le noeud ds:Object référencé en dehors de l'élément ds:Signature, mais le logiciel de vérification renvoie une erreur (nœud référencé n'a pas été trouvé), et le module de vérification de xades4j échoue après avoir rencontré la </internally-detached> tag.

Une signature détachée en interne est-elle possible avec XAdES? Si oui, comment puis-je y parvenir? Je sais que plusieurs signatures sont possibles lorsque les données sont stockées dans un fichier distinct: l'élément SignedProperties de chaque signature doit contenir SignedDataObjectProperties avec ObjectReference, et l'URI de l'élément Reference de SignedInfo doit pointer vers le fichier.

Répondre

1

C'est certainement possible avec les signatures XAdES, car ce sont aussi des signatures XML "régulières". Je ne suis pas sûr de ce que vous voulez dire par "xades4j ne permet même pas un nœud racine autre que ds:Signature"; votre objectif peut être facilement atteint.

En supposant que vous avez le document XML de base sans signatures (soit à partir d'un fichier ou créé à l'aide des API DOM):

<internally-detached> 
    <document Id="data"> 
    <title>title</title> 
    <author>writer</author> 
    <date>today</date> 
    <content> 
     <para>First paragraph</para> 
     <para>Second paragraph</para> 
    </content> 
    </document> 
</internally-detached> 

Ayant cela et, disons, 2 instances configurées différemment de XadesSigner, vous pouvez faire quelque chose comme:

XadesSigner signer1 = ...; 
XadesSigner signer2 = ...; 
Document doc = ...; // your base XML 
Element signaturesParent = doc.getDocumentElement(); 

SignedDataObjects objs = new SignedDataObjects(new DataObjectReference("#data")); 
signer1.sign(obj, signaturesParent); 
signer2.sign(obj, signaturesParent); 

méfiez-vous juste que vous devez define the "data" element's Id attribute as its XML ID.

Cela devrait produire un document similaire à:

<internally-detached> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    ... 
    </ds:Signature> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    ... 
    </ds:Signature> 
    <document Id="data"> 
    <title>title</title> 
    <author>writer</author> 
    <date>today</date> 
    <content> 
     <para>First paragraph</para> 
     <para>Second paragraph</para> 
    </content> 
    </document> 
</internally-detached> 
+0

Merci, malheureusement mon logiciel de vérification ne montre pas la signature générée comme valide (après la fusion avec le document XML de base bien sûr) - « certificat erreur d'intégrité ". Ce que je voulais dire par "xades4j ne permet même pas ..." est que le module de vérification de xades4j renvoie une erreur pour mon fichier de signature modifié manuellement (j'ai mis à jour la question pour être plus précis). Je suis plus intéressé par la structure finale du fichier de signature de sortie que par la façon de le faire dans xades4j (je dois implémenter moi-même la signature), peut-être pourriez-vous poster un exemple? – bmscicho

+0

Bizarre; ça devrait être valide. Qu'entendez-vous par "fusion"? Vous devriez simplement sérialiser le document DOM à la fin et utiliser le fichier résultant pour la vérification. Quant à la sortie finale, j'ai mis à jour la réponse. Si vous avez besoin de détails sur la structure XAdES, jetez un oeil aux tests xades4j, qui contiennent des échantillons. – lgoncalves

+0

OK, je l'ai fait (et le fichier de sortie est le même que lorsque je "fusionné" - je mets le fichier ensemble à la main;). Le numéro de série du certificat est écrit comme un nombre négatif - et c'est (je pense) pourquoi la signature est invalide. – bmscicho