【发布时间】:2013-11-28 21:48:49
【问题描述】:
在我尝试使用的 SOAP 网络服务中,有必要发送具有类似于以下结构的 XML:
<?xml version="1.0"?>
<TheData>
<Father Id="zzz">
<SomeInfo>1</SomeInfo>
<List>
<ElementOfList>
<Child Id="foo">foo</Child>
<Signature>
...
</Signature>
</ElementOfList>
<ElementOfList>
<Child Id="bar">bar</Child>
<Signature>
...
</Signature>
</ElementOfList>
</List>
</Father>
<Signature>
...
</Signature>
</TheData>
其中<Signature>有内容:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#[the _Id_ attr of this Signature's sibling element]">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>uCMzpgMnLCP9iESFQVgpmtQ5TRE=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>...</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>...</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
我该怎么做?
我正在尝试使用xmlsec1 --id-attr:Id Father --id-attr:Id Child,将Signature 字段为空白的文件传递给它,但它只填充其中的第一个。
我也尝试单独签署孩子,将其放在父亲模板中,他们试图签署父亲,但xmlsec1 忽略了第二个元素(并更改了第一个签名的值——不是应该被封装在它的元素内?)。
可能不相关,但谁知道呢?
我宁愿从 Python 代码中执行此操作,但我尝试使用的三个库 python-xmlsec、pyxmlsec 和 xmldsig 都无法生成/重新调整 <Reference> 的 URI attr。可能是因为他们缺少xmlsec1 的--id-attr,但是我得到的这些问题揭示了一个事实,即我并不真正理解这些XML 签名的东西,因此,我做错了事情并弄乱了它全部起来。请帮我理解一下。
编辑
我似乎有很多人在这些 XML 签名主题方面遇到困难,但他们都没有尝试在同一个 XML 文件中签署两个不同的元素。这个案例也没有在w3C Scenarios FAQ 中列出,这让一切看起来都很奇怪,因为我的网络服务需要我多重签名。或者不?这是他们发布的架构:https://github.com/proge/PyNFSe/blob/master/pysped_nfse/nfse.xsd#L539(请参阅此元素 <xsd:element name="EnviarLoteRpsEnvio"> 和子元素)。
【问题讨论】:
-
那么,在签名元素中,你在这里签名的是什么?还有,这里的xml-sec命令是什么?
标签: xml xml-signature xml-dsig