2011-07-28 9 views
3

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

This MSDN article "CAPICOM: CryptoAPI Made Easy"には、CAPICOMまたはP/Invokeを使用する2つの方法が示されています。

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

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

+0

Cobaia、SOにようこそ。あなたの質問を実際の質問に書き換えてください。これは質の高いQ&Aサイトですので、あなたの質問が閉じられるのを嫌っています。 –

+0

私は文言を修正しようとしました。 – Cobaia

答えて

4

CAPICOMは/マイクロソフトによって廃止された古い技術です。 P/Invoke(Platform Invoke)を使用すると、マネージコードはDLLに実装されているアンマネージコードを呼び出すことができます。

これは、CryptoAPIライブラリ用のCOMベースのラッパーです。あなたが投稿した記事は2003年からのものです。これは8年以上前であり、技術は進歩しています。

この記事はMSDNにあります。recommends you use the .NET framework CAPICOMのセキュリティ機能については、こちらをご覧ください。

+0

ありがとう、私はP/Invokeを使用します。私はC#のCrypt32のメソッドをマッピングする記事を見つけたhttp://blogs.msdn.com/b/alejacma/archive/2007/11/23/p-invoking-cryptoapi-in-net-c-version.aspx – Cobaia

1

crypt32's availablilityは、capicom'sは問題にはなりません。同じノートで

しかし、あなたはPに向かう前に、.NETで何のマネージラッパーはありません確認してください\呼び出す

+0

証明書ストアから証明書を取得する必要がありますが、エクスポート可能な場合にのみそのキーを使用できます。ですから、私はcryptAPIを使用します。感謝 – Cobaia

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); 
    } 
+0

ありがとう詳細については。 – Cobaia