XML メッセージのデジタル署名に問題があります。要件では、ECDSA 証明書を特定の曲線で使用することが規定されています。メソッドによって提供される RSA および DSA 機能は、 、およびSignedXml.ComputeSignature(...)
のカスタム実装を作成しないと機能しないことを意味します。SignatureDescription
AsymmetricSignatureFormatter
AsymmetricSignatureDeformatter
そうは言っても、多くのコードを投稿することなく、証明書を取得し、その公開鍵を使用してECDsaCng
クラスを使用してデータに署名する単純な関数を作成しました。これは、上記のカスタム実装を作成するために使用したものです。
何が起こるかというと、私のカスタム実装でも例外がスローされSystem.Security.Cryptography.CryptographicException: Key does not exist.
ます。ただしCngKey
、インポートする代わりに作成するだけでも機能します。私が見ることができることから、この例外は、メソッドを呼び出しているコードからスローされていますinternal static extern ErrorCode NCryptSignHash(...)
。ncrypt.dll
だから私の質問は、例外がスローされる理由System.Security.Cryptography.CryptographicException: Key does not exist.
と、それを解決する方法です。
[TestMethod]
public void CreateSignatureTest()
{
var request = "Some xml goes here...";
var store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates;
var applicableCertificate = certificates.Cast<X509Certificate2>()
.FirstOrDefault(certificate => certificate.Subject.Contains("ECDSA_CERT_NAME"));
var encryptingKey = (ECDsaCng)applicableCertificate.GetECDsaPublicKey();
var exported = encryptingKey.Key.Export(CngKeyBlobFormat.EccPublicBlob);
var creationParameters = new CngKeyCreationParameters
{
ExportPolicy = CngExportPolicies.AllowPlaintextExport
};
using (CngKey objCngKey = CngKey.Import(exported, CngKeyBlobFormat.EccPublicBlob)) // This will throw a Key Does Not Exist Exception
//using (CngKey objCngKey = CngKey.Create(CngAlgorithm.ECDsaP256, null, creationParameters)) // This works...
{
//'Convert String to be signed to a byte array
var data = Encoding.Default.GetBytes(request);
//'Create a ECDsaCng Object
var ecdsa = new ECDsaCng(objCngKey);
//'Sign the string
var bSignature = ecdsa.SignData(data);
//'Convert Signature to Base64 string for better reading
var sSignature = Convert.ToBase64String(bSignature);
}
}