当前位置: 首页 > 知识库问答 >
问题:

使用XmlDsigExcC14NTransform和InclusiveNamespaces验证XML签名时出现问题

颜啸
2023-03-14

我有一个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属性。

<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=“...”部分,导致签名验证失败。

我可以通过编程方式插入它来解决这个问题,但这是一个麻烦,因为会有前缀列表内容的变化。

共有1个答案

秦锐
2023-03-14

也许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#"); 
 类似资料: