18

我正在尝试使用 x.509 证书对 XML 文件进行签名,我可以使用私钥对文档进行签名,然后使用 CheckSignature 方法(它具有接收证书作为参数的重载)来验证签名。

问题是验证签名的用户必须拥有证书,我担心的是,如果用户拥有证书,那么他可以访问私钥,据我所知,这是私有的,应该只对用户可用谁签名。

我错过了什么?

谢谢你的帮助。

4

3 回答 3

19

在 .NET 中,如果您从 .pfx 文件中获取 X509 证书,如下所示:

 X509Certificate2 certificate = new X509Certificate2(certFile, pfxPassword);
 RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider) certificate.PrivateKey;   

然后您可以像这样导出公钥部分:

 rsaCsp.ToXmlString(false);

“假”部分说,只导出公共片,不导出私人片。(RSA.ToXmlString的文档)

然后在验证应用程序中,使用

 RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
 csp.FromXmlString(PublicKeyXml);
 bool isValid = VerifyXml(xmlDoc, rsa2);

并且 VerifyXml 调用CheckSignature(). 它看起来像这样:

private Boolean VerifyXml(XmlDocument Doc, RSA Key)
{
    // Create a new SignedXml object and pass it
    // the XML document class.
    var signedXml = new System.Security.Cryptography.Xml.SignedXml(Doc);

    // Find the "Signature" node and create a new XmlNodeList object.
    XmlNodeList nodeList = Doc.GetElementsByTagName("Signature");

    // Throw an exception if no signature was found.
    if (nodeList.Count <= 0)
    {
        throw new CryptographicException("Verification failed: No Signature was found in the document.");
    }

    // Though it is possible to have multiple signatures on 
    // an XML document, this app only supports one signature for
    // the entire XML document.  Throw an exception 
    // if more than one signature was found.
    if (nodeList.Count >= 2)
    {
        throw new CryptographicException("Verification failed: More that one signature was found for the document.");
    }

    // Load the first <signature> node.  
    signedXml.LoadXml((XmlElement)nodeList[0]);

    // Check the signature and return the result.
    return signedXml.CheckSignature(Key);
}
于 2009-07-29T07:13:25.470 回答
5

任何证书都有公共部分和私有部分。您只发送公共部分。只需在浏览器中打开任何启用 SSL 的网站,单击挂锁符号并查看其证书。

于 2009-07-28T18:19:43.810 回答
0

首先,您需要确保您使用的证书 .pfx 或 .cer 用于签名目的。

您可以在证书的常规选项卡中检查相同

*.向远程计算机证明您的身份
*.保护电子邮件
*.允许使用当前时间对数据进行签名
*.允许加密磁盘上的数据
*.2.16.356.100.2
**文件签名**

此处编写了一个完整的控制台应用程序,用于在 C# 中对 XmlDocument 进行数字签名/验证。

于 2015-09-29T09:20:14.097 回答