使用 XmlDsigExcC14NTransform 和 InclusiveNamespaces 验证 XML 签名时遇
本文关键字:XML 验证 XmlDsigExcC14NTransform InclusiveNamespaces 使用 | 更新日期: 2023-09-27 17:56:47
我有一个XML文档,我需要在其中验证签名。SignedInfo 元素具有指定算法"http://www.w3.org/2001/10/xml-exc-c14n#"的元素 CanonicalizationMethod,并且还具有一个子元素 InclusiveNamespaces,该元素具有填充的 PrefixList 属性,如下所示:
<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="..."
部分,导致签名验证失败。
我可以通过以编程方式插入它来解决这个问题,但这很痛苦,因为前缀列表内容会有变化。
也许这个帖子表格Microsoft可以帮助你:https://support.microsoft.com/en-us/kb/2639079
它们演示如何为规范化算法注册自定义转换。它用于删除命名空间,但我认为您也可以使用它来添加一个命名空间。
public class MyXmlDsigExcC14NTransform : XmlDsigExcC14NTransform
{
public MyXmlDsigExcC14NTransform() {}
public override void LoadInput(Object obj)
{
XmlElement root = ((XmlDocument)obj).DocumentElement;
if (root.Name == "SignedInfo") root.RemoveAttribute("xml:id");
base.LoadInput(obj);
}
}
在应用程序开始时,可以使用以下调用注册MyXmlDsigExcC14NTransform:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");