17

私はx.509証明書を使用してXMLファイルに署名しようとしています。私は秘密鍵を使って文書に署名してからCheckSignatureメソッド(証明書をパラメータとして受け取るオーバーロードがある)を使用して署名を検証します。C#では、x.509証明書でxmlに署名し、署名を確認します

問題は、署名を検証するユーザーが証明書を持っていなければならないことです。私の懸案事項は、ユーザーが証明書を持っていて、秘密鍵にアクセスできれば分かります。署名するユーザーにのみ許可します。

私には何が欠けていますか?

ありがとうございました。

答えて

5

すべての証明書には、公開部分と非公開部分があります。あなたは公共の部分の周りだけを送信します。ブラウザでSSL対応ウェブサイトを開き、南京錠のシンボルをクリックして証明書を確認してください。 .NETで

+0

ありがとう、それは私がはっきりとわからなかったものです。 "署名者"証明書を取得し、 "検証者"として.cerファイルを使用するには、X509Storeの証明書を使用する必要があることがわかりました。 – willvv

19

、あなたはこのように、.pfxファイルからあなたX509証明書を取得する場合:

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

が次にあなたがそうのように、公開キー部分をエクスポートすることができます。

rsaCsp.ToXmlString(false); 

を」偽 "の部分は、公共の部分をエクスポートするだけで、プライベートな部分をエクスポートしないと言う。 (RSA.ToXmlString用DOC)の検証アプリケーションで

そして、

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

コードはhttp://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspxにあるようです。私はそれにリンクするのではなく、ここにコードを入れてもいいと思いますが、それが期限切れになった場所を信用してください。 –

0

まず第一に、あなたが使用している証明書を.pfxまたは .cerのが目的に署名するために意図されていることを確認するために必要なすべて:それは次のようになります。デジタル/ C#でのXmlDocumentを検証する署名する

 
You can check same in General Tab of a certificate 

*.Proves your identity to a remote computer 
*.Protects e-mail messages 
*.Allows data to be signed with the current time 
*.Allows data on disk to be encrypted 
*.2.16.356.100.2 
**Document Signing** 

完全なコンソールアプリケーションがhere書き込まれます。

関連する問題