1

我有一个需要验证签名的 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(忽略空格)时,它应该像这样出来(注意第xmlns:soapenv="..."2 行的部分):

<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 内容会有所不同。

4

1 回答 1

1

也许这个帖子形式微软可以帮助你: 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#"); 
于 2015-07-21T09:10:37.340 回答