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 です。私の(基本的な)理解は、秘密鍵を持ってはならず、公開鍵を使用して署名を作成できるはずだということです。
何が欠けていますか?
前もって感謝します