3

C# で CryptoAPI を使用して証明書ストアにアクセスし、メッセージに署名したいと考えています。

この MSDN の記事「CAPICOM: CryptoAPI Made Easy」では、CAPICOM または P/Invoke を使用する 2 つの方法が示されています。

  1. どれが最高ですか?CAPICOM.dll または P/Invoke[DllImport("crypt32.dll", ...)]

  2. 「crypt32.dll」はどのマシンにも常に存在しますか?

4

3 に答える 3

4

CAPICOM は、Microsoft によって廃止されている、または廃止されている古いテクノロジです。P/Invoke (プラットフォーム呼び出し) を使用すると、DLL に実装されているアンマネージ コードをマネージ コードから呼び出すことができます。

これは、CryptoAPI ライブラリの COM ベースのラッパーです。あなたが投稿した記事は 2003 年のものです。それは 8 年以上前のことであり、テクノロジーは進歩しています。

MSDN のこの記事では、セキュリティ機能に CAPICOM の代わりに.NET フレームワークを使用することを推奨しています。

于 2011-07-28T14:30:02.437 に答える
1

crypt32の可用性は問題に反対するべきではありませんが、 capicomは反対します。

ただし、同じように、p \ invokeに進む前に、.Netにマネージラッパーがないことを確認する必要があります。

于 2011-07-28T14:29:46.413 に答える
1

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);
    }
于 2011-07-28T14:42:37.610 に答える