【问题标题】:XML Signature over XML with existing signature具有现有签名的 XML 上的 XML 签名
【发布时间】:2015-11-17 23:15:00
【问题描述】:

我想签署一个如下所示的 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>
</Foo>

这样它添加了另一个签名(带有相应的摘要值和签名值),它应该看起来像这样:

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

进行我的转换的java代码是:

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

我应该使用什么 XPATH 表达式来消化整个 XML 而不仅仅是“Foo”(就像我对前一个所做的那样)?

到目前为止我已经尝试过:

  • not(ancestor-or-self::ds:Signature[@Id='PAC'])
  • (ancestor-or-self::Foo 而不是 (ancestor-or-self::ds:Signature[@Id = 'PAC'])) 或祖先或自我::ds:Signature[@Id = '录音']
  • not(ancestor-or-self::ds:Signature[@Id='PAC']) 或 (ancestor-or-self::ds:Signature[@Id='REC'])

...没有运气。

感谢您的宝贵时间。

【问题讨论】:

    标签: java xml apache xpath xml-signature


    【解决方案1】:

    方法 not(ancestor-or-self::ds:Signature[@Id='PAC']) 对于 XPATH 获取除当前签名之外的所有 XML 是正确的(在这种情况下是具有属性的签名) 'Id' 的值为 'PAC')我发现我输入错误的 XML 并且它具有不同的值。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多