18

I'm trying to sign an XML file using a x.509 certificate, I can use the private key to sign the document and then use the CheckSignature method (it has an overload that receives a certificate as parameter) to verify the signature.

The problem is that the user who validates the signature must have the certificate, my concern is, if the user has the certificate then he has access to the private key, and as I understand, this is private and should be available only to the user who signs.

What am I missing?

Thanks for your help.

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 対応の Web サイトを開き、南京錠の記号をクリックして証明書を確認してください。

于 2009-07-28T18:19:43.810 に答える
0

まず、使用している証明書 .pfx または .cer が署名目的のものであることを確認する必要があります。

証明書の [全般] タブで同じことを確認できます

*.あなたの身元をリモート コンピューターに証明します
*.電子メール メッセージを保護します
*.現在の時刻でデータを署名できるようにします
*.ディスク上のデータを暗号化できます
*.2.16.356.100.2
**書類への署名**

C# で XmlDocument をデジタル署名/検証するための完全なコンソール アプリケーションは、ここに書かれています。

于 2015-09-29T09:20:14.097 に答える