FindPrivateKey サンプル

証明書ストア内の特定の X.509 証明書に関連付けられている秘密キー ファイルの場所と名前を見つけることが困難な場合があります。 FindPrivateKey.exe ツールを使用すると、この処理を容易に実行できます。

重要

使用前に、FindPrivateKey サンプルをビルドする必要があります。

X.509 証明書は、コンピューターの管理者または任意のユーザーによってインストールされます。 しかし、別のアカウントで実行されているサービスによって証明書にアクセスされる可能性があります。 たとえば、NETWORK SERVICE アカウントなどです。

別のアカウントでは、秘密キー ファイルへアクセスできない場合があります。これは、証明書が最初にこのアカウントによってインストールされていないからです。 FindPrivateKey ツールでは、指定された X.509 証明書の秘密キー ファイルの場所を検索できます。 特定の X.509 証明書の秘密キー ファイルの場所がわかれば、このファイルに対するアクセス許可の追加または削除を実行できます。

セキュリティ用の証明書を使用するこのサンプルでは、Setup.bat ファイル内の FindPrivateKey ツールを使います。 秘密キー ファイルが見つかったら、Cacls.exe などの別のツールを使用して、このファイルに対する適切なアクセス権を設定できます。

自己ホスト型の実行可能ファイルなどの Windows Communication Foundation (WCF) サービスをユーザー アカウントで実行する場合は、そのユーザー アカウントにそのファイルへの読み取り専用のアクセス権限があることを確かめます。 インターネット インフォメーション サービス (IIS) で WCF サービスを実行する場合、サービスが実行される既定のアカウントは、IIS 7 以前のバージョンのネットワーク サービス、または IIS 7.5 以降のバージョンのアプリケーションプール ID です。 詳細については、「アプリケーション プール ID」を参照してください。

読み取り権限

証明書にアクセスする際に、プロセスにその証明書に対する読み取り権限がない場合、次の例のような例外メッセージが表示されます。

System.ArgumentException was unhandled
Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange. The process must have access rights for the private key."
Source="System.ServiceModel"

これが発生したら、FindPrivateKey ツールを使用して秘密キー ファイルを検索し、サービスが実行されているプロセスにアクセス権を設定します。 たとえば、これは、次の例に示すように Cacls.exe ツールを使用して行うことができます。

cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R

規約 - コマンド ラインのエントリ

"[option]" は省略可能なパラメーターのセットを表します。

"{option}" は必須パラメーターのセットを表します。

"option1 | option2" はオプションのセットから選択することを表します。

"<value>" は入力されるパラメーター値を表します。

使用方法

FindPrivateKey <storeName> <storeLocation> [{ {-n <subjectName>} | {-t <thumbprint>} } [-f | -d | -a]]

条件:

パラメーター 説明
<subjectName> 証明書のサブジェクト名
<thumbprint> 証明書の拇印 (これは Certmgr.exe ツールを使用して見つけることができます)
-f 出力ファイル名のみ
-d 出力ディレクトリのみ
-a 出力の絶対ファイル名

コマンド プロンプトでパラメーターが指定されていない場合は、この情報を含むヘルプ テキストが表示されます。

この例では、現在のユーザーの Personal ストアで、"CN=localhost" というサブジェクト名を持つ証明書のファイル名を検索します。

FindPrivateKey My CurrentUser -n "CN=localhost"

この例では、現在のユーザーの Personal ストアで、"CN=localhost" というサブジェクト名を持つ証明書のファイル名を検索し、ディレクトリの完全パスを出力します。

FindPrivateKey My CurrentUser -n "CN=localhost" -a

この例では、ローカル コンピューターの Personal ストアで、"03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52" というサムプリントを持つ証明書のファイル名を検索します。

FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52"