【发布时间】:2015-06-18 04:51:44
【问题描述】:
我有一个需要验证签名的 XML 文档。 SignedInfo 元素具有指定算法“http://www.w3.org/2001/10/xml-exc-c14n#”的元素 CanonicalizationMethod,并且还具有带有填充 PrefixList 属性的子元素 InclusiveNamespaces,如下所示:
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>...
我使用以下代码创建我的 C14Transform 对象:
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(false, "soapenv");
其中"soapenv" 来自PrefixList 属性。
当规范化上述 XML(忽略空格)时,它应该像这样出来(注意第 2 行的 xmlns:soapenv="..." 部分):
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>
...
我遇到的问题是规范化时没有包含xmlns:soapenv="..."部分,导致签名验证失败。
我可以通过以编程方式插入它来解决这个问题,但这很痛苦,因为 PrefixList 内容会有所不同。
【问题讨论】:
-
我怀疑你能做的还有很多。它会在哪里神奇地推断它应该添加的命名空间声明的 uri?如果需要验证签名,原件不应该有这个属性吗?
-
命名空间声明确实存在于 xml 文档中,只是在其他地方。我希望必须打开转换对象上的一些设置,以便规范版本正确显示。我已经确认这在其他语言中可以正常工作,至少是 php。此外,InclusiveNamespaces 是 Exclusive Canonicalization W3C 标准的一部分,所以我认为 Microsoft 已经涵盖了它。
标签: c# xml digital-signature xml-dsig