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

csg*_*csg 6 .net c# xml sign xml-signature

我需要验证签名的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>
Run Code Online (Sandbox Code Playgroud)

Dan*_*con 1

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

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);
    }
  }

 ...
}
Run Code Online (Sandbox Code Playgroud)