.NET 中的 SignedXML 出现问题

本文关键字:问题 SignedXML 中的 NET | 更新日期: 2023-09-27 18:31:34

我正在尝试使用数字签名对XML文档进行签名。我安装了证书,输出似乎类似于规范(命名空间除外,这似乎是我在 .NET 中无法触及的东西),但是我无法获得我发送此证书以接受此内容的 Web服务,并且它返回错误:

验证

XML:验证失败:签名无效

我无法控制此网络服务,并且此服务的提供者声称其他人对此网络服务没有问题。

我也尝试使用此验证工具:

http://www.aleksey.com/xmlsec/xmldsig-verifier.html

返回错误:数据不匹配:签名不匹配,因此,我认为我做错了什么。

我的代码如下所示:

X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxx",
    true).OfType<X509Certificate2>().FirstOrDefault();
store.Close();
XmlDocument xmlDoc = new XmlDocument();
XmlNamespaceManager namespaces = new XmlNamespaceManager(xmlDoc.NameTable);
namespaces.AddNamespace("ns", "xxxx");
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(new XmlTextReader("C:''Development''testheader.xml"));
SignedXml signedXml = new SignedXml(xmlDoc);
signedXml.SigningKey = cert.PrivateKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
XmlDsigC14NTransform c14n = new XmlDsigC14NTransform();
reference.AddTransform(c14n);
signedXml.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
XmlNode parentNode = xmlDoc.SelectSingleNode("/ns:TopLevelNode", namespaces);
parentNode.InsertAfter(xmlDoc.ImportNode(signedXml.GetXml(), true),
    parentNode.FirstChild);
if (xmlDoc.FirstChild is XmlDeclaration)
    xmlDoc.RemoveChild(xmlDoc.FirstChild);
XmlTextWriter xmltw = new XmlTextWriter("C:''Development''test2.xml",
    new UTF8Encoding(false));
xmlDoc.WriteTo(xmltw);
xmltw.Close();

我尝试在 .NET 中验证 SignedXML,这似乎可以验证,但由于它是编写它的语言,所以我不太信任它。

我的规格如下所示:

<Signature xmlns="NonStandard">
  <SignedInfo>
    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
    <Reference URI="">
      <Transforms>
        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      </Transforms>
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <DigestValue>…</DigestValue>
    </Reference>
  </SignedInfo>
  <SignatureValue>…</SignatureValue>
  <KeyInfo>
    <X509Data>
       <X509Certificate>…</X509Certificate>
    </X509Data>
  </KeyInfo>
</Signature>

我做错了什么吗?我不确定命名空间在签署 XML 方面有多重要,但由于这似乎是 .NET"一成不变",我怀疑这可能是它?

.NET 中的 SignedXML 出现问题

上面的代码按预期工作,只是如果有人想知道如何对 XML 进行签名(除了已经存在的大量示例)。网络服务出现问题。

此致敬意安德烈亚斯