2015-11-17 2 views
0

Je veux signer une chaîne XML qui ressemble à ceci:Signature XML sur XML avec la signature existante

<Foo> 
<ds:Signature Id="REC"> 
    <ds:SignedInfo> 
    <ds:CanonicalizationMethod /> 
    <ds:SignatureMethod /> 
    <ds:Reference> 
     <ds:Reference URI=""> 
     <ds:Transforms> 
      <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> 
      <ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath> 
      </ds:Transform> 
     </ds:Transforms> 
     <ds:DigestMethod> 
     <ds:DigestValue> 
    </ds:Reference> 
    <ds:Reference /> etc. 
    </ds:SignedInfo> 
    <ds:SignatureValue /> 
    <ds:KeyInfo /> 
    <ds:Object /> 
</ds:Signature> 
</Foo> 

Alors qu'il ajoute une autre signature (avec le DigestValue et SignatureValue correspondant) et il devrait ressembler à ceci:

<Foo> 
    <ds:Signature Id="REC"> 
     <ds:SignedInfo> 
     <ds:CanonicalizationMethod /> 
     <ds:SignatureMethod /> 
     <ds:Reference> 
      <ds:Reference URI=""> 
     <ds:Transforms> 
      <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> 
      <ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath> 
      </ds:Transform> 
     </ds:Transforms> 
      <ds:DigestMethod> 
      <ds:DigestValue> 
     </ds:Reference> 
     <ds:Reference /> etc. 
     </ds:SignedInfo> 
     <ds:SignatureValue /> 
     <ds:KeyInfo /> 
     <ds:Object /> 
    </ds:Signature> 
    <ds:Signature Id="PAC"> 
     <ds:SignedInfo> 
     <ds:CanonicalizationMethod /> 
     <ds:SignatureMethod /> 
     <ds:Reference> 
      <ds:Transforms> 
      <ds:DigestMethod> 
      <ds:DigestValue>[DIGEST VALUE OF ALL THE PREVIOUS XML]</ds:DigestValue> 
     </ds:Reference> 
     <ds:Reference /> etc. 
     </ds:SignedInfo> 
     <ds:SignatureValue /> 
     <ds:KeyInfo /> 
     <ds:Object /> 
    </ds:Signature> 
    </Foo> 

Le code java qui fait ma transformation est:

_TRANSFORM = "not(ancestor-or-self::ds:Signature)"; 
XPathContainer xpathC = new XPathContainer(doc2); 
xpathC.setXPath(_TRANSFORM); 

Transforms transforms = new Transforms(doc2); 
transforms.addTransform("http://www.w3.org/TR/1999/REC-xpath-19991116",xpathC.getElement()); 
signature.addDocument("", transforms); 

Qu'est-ce que XPATH EXPRE ssion dois-je utiliser pour obtenir une digestion de tout le XML et pas seulement "Foo" (comme je l'ai fait avec le précédent)?

Jusqu'à présent, Ive a essayé:

  • pas (ancêtre ou auto-:: ds: Signature [@ id = 'PAC'])
  • (ancêtre ou self :: Foo et non (ancestor-or-self :: ds: Signature [@Id = 'PAC'])) ou ancêtre-ou-self :: ds: Signature [@Id = 'REC']
  • pas (ancêtre ou soi) :: ds: Signature [@ Id = 'PAC']) ou (ancêtre-ou-soi :: ds: Signature [@ Id = 'REC'])

... sans chance.

Nous vous remercions de votre temps.

Répondre

0

La méthode non (ancestor-or-self :: ds: Signature [@ Id = 'PAC']) est correcte pour que le XPATH récupère tout le XML sauf la signature courante (dans ce cas, celle qui a un attribut 'Id' avec une valeur 'PAC') J'ai découvert que je donnais un mauvais départ au XML et qu'il avait des valeurs différentes.