C# で CryptoAPI を使用して証明書ストアにアクセスし、メッセージに署名したいと考えています。
この MSDN の記事「CAPICOM: CryptoAPI Made Easy」では、CAPICOM または P/Invoke を使用する 2 つの方法が示されています。
どれが最高ですか?CAPICOM.dll または P/Invoke
[DllImport("crypt32.dll", ...)]
「crypt32.dll」はどのマシンにも常に存在しますか?
C# で CryptoAPI を使用して証明書ストアにアクセスし、メッセージに署名したいと考えています。
この MSDN の記事「CAPICOM: CryptoAPI Made Easy」では、CAPICOM または P/Invoke を使用する 2 つの方法が示されています。
どれが最高ですか?CAPICOM.dll または P/Invoke[DllImport("crypt32.dll", ...)]
「crypt32.dll」はどのマシンにも常に存在しますか?
CAPICOM は、Microsoft によって廃止されている、または廃止されている古いテクノロジです。P/Invoke (プラットフォーム呼び出し) を使用すると、DLL に実装されているアンマネージ コードをマネージ コードから呼び出すことができます。
これは、CryptoAPI ライブラリの COM ベースのラッパーです。あなたが投稿した記事は 2003 年のものです。それは 8 年以上前のことであり、テクノロジーは進歩しています。
MSDN のこの記事では、セキュリティ機能に CAPICOM の代わりに.NET フレームワークを使用することを推奨しています。
crypt32の可用性は問題に反対するべきではありませんが、 capicomは反対します。
ただし、同じように、p \ invokeに進む前に、.Netにマネージラッパーがないことを確認する必要があります。
CAPICOM の使用は必須ですか? それは機能しますが、いくつかの非常に厄介な欠点があり、それを使用/しない/しない場合は、System.Security.Cryptography を使用することをお勧めします。
とにかく: CAPICOM を使用するには、まずプロジェクトに参照を追加する必要があります。それで:
CAPICOM.SignedData signeddata = new CAPICOM.SignedData();
FileStream file = File.Open(tbSourceFile.Text, FileMode.Open);
byte[] Content = new byte[(int)file.Length];
file.Read(Content, 0, (int)file.Length);
file.Close();
StringWriter sw = new StringWriter();
sw.Write(Content);
signeddata.Content = sw.ToString();
IStore store = new CAPICOM.Store();
store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
ICertificates2 certificates = (ICertificates2)store.Certificates;
certificates = certificates.Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE, true);
if (certificates.Count > 0)
{
certificates = certificates.Select();
}
if (certificates.Count > 0)
{
ISigner2 signers = new CAPICOM.Signer();
signers.Certificate = certificates[1];
tbSignatureBlock.Text = signeddata.Sign(signers, true);
}