【问题标题】:Trouble verifying XML signature with XmlDsigExcC14NTransform and InclusiveNamespaces使用 XmlDsigExcC14NTransform 和 InclusiveNamespaces 验证 XML 签名时遇到问题
【发布时间】: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


【解决方案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#"); 

【讨论】:

  • 嘿,谢谢。这比我现在做的更干净,但是我仍然暗暗希望微软的库能正确处理前缀列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2017-09-07
相关资源
最近更新 更多