SignedXml 报告“遇到未知转换。”

Posted

技术标签:

【中文标题】SignedXml 报告“遇到未知转换。”【英文标题】:SignedXml reports "Unknown transform has been encountered." 【发布时间】:2018-03-21 17:15:42 【问题描述】:

我需要验证一个签名的 xml。

在 c# 中运行时出现下一个错误:“遇到未知转换。”。但是在 java 中运行它正确地验证了 xml。

看起来 .net 框架无法识别 xmldsig-filter2。在 c#/.net 中可以对这个问题做些什么吗?

<dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
  <dsig:SignedInfo>
    <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <dsig:Reference Id="reference-data-0" URI="">
      <dsig:Transforms>
        <dsig:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
          <xf2:XPath Filter="intersect" xmlns:xf2="http://www.w3.org/2002/06/xmldsig-filter2">here()/ancestor::SomeNS:SomeElement[1]</xf2:XPath>
        </dsig:Transform>
        <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <dsig:DigestValue>...</dsig:DigestValue>
    </dsig:Reference>
  </dsig:SignedInfo>
  <dsig:SignatureValue>
    ...
  </dsig:SignatureValue>
</dsig:Signature>

【问题讨论】:

有什么解决办法吗?我真的很想避免将 IKVM 填充到我的项目中。 【参考方案1】:

您可以从Transform 类派生并自己实现算法并使用CryptoConfig.AddAlgorithm 注册转换。但是 .NET 不允许转换对于规范化是安全的,因此您必须在 HKLM:\\SOFTWARE\Microsoft\.NETFramework\Security\SafeTransformMethods 下的 registry 中允许它,或者使用反射来修改保存列表的私有字段。

public class XmlDigSigFilter2Transform : Transform 
  public static void Register() 
    var self = CryptoConfig.CreateFromName(Url);
    if (self == null) 
      CryptoConfig.AddAlgorithm(typeof(XmlDigSigFilter2Transform), Url);
    
    var signedXmlType = typeof(SignedXml);
    var knownCanonicalizationMethodsField =
      signedXmlType.GetField(
        "s_knownCanonicalizationMethods",
        BindingFlags.NonPublic | BindingFlags.Static);

    if (knownCanonicalizationMethodsField == null) 
      return;
    

    var knownCanonicalizationMethodsValue =
      knownCanonicalizationMethodsField.GetValue(new SignedXml());

    if (!(knownCanonicalizationMethodsValue is IList<string> list)) 
      return;
    

    if (!list.Contains(Url)) 
      list.Add(Url);
    
  

 ...

【讨论】:

以上是关于SignedXml 报告“遇到未知转换。”的主要内容,如果未能解决你的问题,请参考以下文章

将 System.Security.Cryptography.Xml 从 4.7.0 更新到 5.0.0 后 SignedXml.CheckSIgnature NullReferenceExcepti

仅从公钥创建 RSACryptoServiceProvider

我在访问子节点时遇到问题。 (firebase 实时数据库 - 增量报告)

如何更改 RSACryptoServiceProvider 的 CSP 参数

测试报告 alpha

pytest问题解决遇到pytest 执行不了allure,生成不了allure测试报告怎么办?