首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SignedXML在.NET中的问题

SignedXML在.NET中的问题
EN

Stack Overflow用户
提问于 2013-09-17 16:05:47
回答 1查看 2.2K关注 0票数 0

我正在尝试使用数字签名来签署XML文档。我已经安装了证书,输出看起来类似于规范(除了名称空间,它似乎是我在.NET中无法触摸的东西),但是我无法获得我要发送的WebService来接受它,它返回时会出现错误:

VerifyXml:验证失败:签名无效

我没有控制这个WebService,这个服务的供应商声称其他人对这个WebService没有问题。

我也尝试过使用这个验证工具:

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

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

我的代码如下所示:

代码语言:javascript
复制
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();

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

我的规范如下所示:

代码语言:javascript
复制
<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>

我是不是做错了什么事?我不确定Namespace在签署XML方面有多重要,但是由于这似乎是一个“固定在一起”的.NET,我怀疑这会是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 14:16:01

上面的代码按照预期工作,只是如果有人想知道如何签署XML (除了已经有很多例子)。WebService有个问题。

向安德烈亚斯问好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18854644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档