2

C# (4.0) で、X509Certificate (署名を検証する必要があるものによって提供される .p7b ファイル) を使用して XML (XMLDSig Envelope) に署名する必要があります。セキュリティの経験がありません。私の知識はいくつかの基本的な概念に止まります。暗号について。

これが私がやったことです:

1) 証明書を次の場所にインストールしました: 証明書 - 現在のユーザー - 信頼されたルート証明書。

2) .net から、次のコードで証明書を正常にロードしました:

X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
try
{
    store.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, certName, false);
    if (certs.Count == 0)
        return null;

    return certs[0];
}
finally
{
    store.Close();
}

3) 証明書の公開鍵を使用して、次のコードで署名を作成しようとしました。

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
var reader = new StringReader(xml);
doc.Load(reader);
var signedXml = new SignedXml(doc);
X509Certificate2 certificate = this.GetCertificateFromStore(certName); // the previous code
signedXml.SigningKey = (RSACryptoServiceProvider)certificate.PublicKey.Key;
var reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signedXml.ComputeSignature(); //  exception!!!
var element = signedXml.GetXml();
doc.AppendChild(doc.ImportNode(element, true));

しかし、署名を計算すると、「オブジェクトには鍵ペアの公開半分のみが含まれています。秘密鍵も提供する必要があります。」という例外が発生します。

証明書のプロパティ HasPrivateKey を確認しましたが、false です。私の(基本的な)理解は、秘密鍵を持ってはならず、公開鍵を使用して署名を作成できるはずだということです。

何が欠けていますか?

前もって感謝します

4

2 に答える 2

2

.p7bは、通常は秘密鍵を含まないPKCS#7形式を表します。あなたが文書に署名するとき、あなたはあなたが所有し、あなたが秘密にしなければならない秘密鍵を適用することによってそれが本物であることを証明します。したがって、(おそらくネットワーク管理者や銀行以外の)誰かがあなたに秘密鍵を与える可能性はほとんどありません。

于 2011-04-26T17:44:37.490 に答える
2

コンテンツのデジタル署名を作成する場合、このコンテンツのダイジェストを秘密鍵で暗号化し、元のコンテンツと署名を受信者に送信します。

検証フェーズ: 検証者は、公開鍵を使用して署名を復号化し、ハッシュ H1 を取得します。次に、元のコンテンツが受信者によって H1 にハッシュされます。受信者は、H1 が H2 と等しいかどうかを検証し、そうでない場合は署名の検証に失敗します。

于 2011-05-06T20:43:47.457 に答える