10

.pfxX.509 証明書を含むファイルの内容を表すバイト配列を受け取る ASP.NET Web サービスがあります。サーバー側のコードは、System.Security.Cryptography.X509Certificate2コンストラクターを使用してバイトから証明書をロードしています。

X509Certificate2 native_cert = new X509Certificate2(
                pkcs12_buf /*byte array*/,
                password,
                X509KeyStorageFlags.PersistKeySet |
                X509KeyStorageFlags.Exportable
            );

サービス プロセスが誰として実行されているかに応じて、この呼び出しは成功するか、「内部エラー」例外で失敗します。例外スタックの最後の呼び出しはです。X509Utils._LoadCertFromBlobこれは のアンマネージ コードですmscore.dll

このコードは、サービス アカウントの資格情報を使用して対話型ログインでコンソール アプリケーションから実行すると成功します。w3wp.exeサービス アカウントの資格情報を使用するアプリケーション プールで実行すると失敗します。アプリ プール ID を管理者に変更すると問題が解決するため、権限の問題であるに違いありませんが、これにはどのような権限が必要なのかわかりません。このコードは、ファイル システムや Windows 証明書ストアには触れません。

[更新: 詳細情報]
Windows イベント ログに次のエラーが表示されます。

*Cryptographic Parameters:*   
**Provider Name:**  Microsoft Software Key Storage Provider  
**Algorithm Name:** Not Available.  
**Key Name:**   {E182E13B-166D-472A-A24A-CBEF0808E9ED}  
    **Key Type:**   User key.

*Cryptographic Operation:*  
**Operation:**  Open Key.  
    **Return Code:**    0x2  

何か案は?

4

2 に答える 2

9

私は自分でこれに対する解決策を見つけました:

X509KeyStorageFlags flags = X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet;

X509Certificate2 cert = new X509Certificate2(pkcs12_buf, password, flags);

ここでの秘訣MachineKeySetは、ユーザー プロファイル キー ストアの代わりにローカル キー ストア フラグを使用することです。これは、別の場所を指定しない場合のデフォルトです。ASP.NET プロセス ID はユーザー プロファイル ストアを読み込まないため、証明書をプログラムでインポートするときにストアにアクセスすることはできませんが、マシン ストアにはアクセスできます。

秘密鍵をロードしたままにするだけだと思いますPersistKeySetが、それが何をするのか正確にはわかりません-何らかの理由で秘密鍵にアクセスする必要がある場合は必要です。

于 2009-02-27T05:28:35.170 に答える
2

次のフォルダーにASP.NETアカウントのアクセス許可を付与してみてください:(C:\Documents And Settings\All Users\Microsoft\Crypto\RSA\MachineKeys\環境によって異なる場合があります)

于 2009-02-17T19:56:33.777 に答える