具有现有签名的XML上的XML签名

时间:2015-11-17 23:15:01

标签: java xml apache xpath xml-signature

我想签署一个如下所示的XML字符串:

<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>

这样它就会添加另一个签名(带有相应的digestvalue和signaturevalue),它应该是这样的:

_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);

进行转换的java代码是:

[self.view endEditing:YES];

我应该使用什么XPATH表达式来消化整个XML,而不仅仅是&#34; Foo&#34; (就像我之前做的那样)?

到目前为止,我曾尝试过:

  • 不(祖先或自身:: DS:签名[@Id =&#39; PAC&#39;])
  • (祖先或自我:: Foo而不是(祖先或自我:: ds:签名[@Id =&#39; PAC&#39;]))或祖先 - 或 - 自我:: ds:签名[@Id =&#39; REC&#39;]
  • not(ancestor-or-self :: ds:Signature [@Id =&#39; PAC&#39;])或(祖先或自我:: ds:签名[@Id =&#39; REC& #39;])

......没有运气。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

方法不是(祖先或自我:: ds:签名[@Id =&#39; PAC&#39;])对于XPATH来说是正确的,以获取除当前签名之外的所有XML(在本例中为一个具有属性&#39; Id&#39;值为&#39; PAC&#39;)我发现我误输了XML并且它有不同的值。