4

PRIVATEKEYBLOBとして保存されている、以前に生成された RSA 秘密署名鍵があります。キーをより適切に管理するために、これを新しい証明書に移動しようとしています。この BLOB を取得して .pfx 証明書に変換するにはどうすればよいですか?

私は HCRYPTPROV を持っています (MS_ENHANCED_PROV と PROV_RSA_FULL を使用します)。CryptImportKey から HCRYPTKEY を取得できます。

PFXExportCertStoreEx は、それを PFX BLOB にエクスポートする機能のようですが (ファイルに書き込むと想定しています)、キーを取得する方法がわかりません。

4

1 に答える 1

2

私があなたの問題を正しく理解していれば、証明書と対応する秘密鍵をデータ blob として持っており、両方とも別個のものです。CryptoAPI を使用する場合、API は主に、証明書ストアに格納されている証明書とキー コンテナーに格納されている秘密鍵を操作することに重点を置いていることを理解することが重要です。PFXExportCertStoreExのような関数はこのアプローチに従い、すべての証明書を 1 つの証明書ストアから .PFX 拡張子のファイルとして保存できるデータ BLOB にエクスポートできます。

したがって、できることは次のとおりです。

  1. パラメータを指定してCertOpenStoreを使用して、一時的な証明書ストアを作成しCERT_STORE_PROV_MEMORYます。
  2. CertAddEncodedCertificateToStore関数を使用してストアに BLOB を証明書に配置します。
  3. オプションでCryptAcquireContextを使用して新しいキー コンテナーを作成しCRYPT_NEWKEYSETます。コンテナーに一意の名前を付ける必要があります (pszContainer関数のパラメーターを参照)。
  4. CryptImportKey関数PRIVATEKEYBLOBに関して、現在持っている からキーコンテナに情報をインポートします。
  5. 証明書ストアからキー コンテナーに証明書をバインドします。これを行うには、CertSetCertificateContextPropertyを使用して、証明書の拡張プロパティCERT_KEY_PROV_INFO_PROP_IDと呼ばれるものを設定する必要があります。拡張プロパティは X.509 仕様の一部ではないことを理解することが重要です。拡張プロパティを使用すると、証明書に関連付けられた追加情報を(証明書自体ではなく) 証明書ストアに格納できます。完全な情報 ( CRYPT_KEY_PROV_INFO )を格納できる場合は、キー コンテナーを記述します。CERT_KEY_PROV_INFO_PROP_ID
  6. これで、 PFXExportCertStoreExを使用して一時的な証明書ストア (証明書を 1 つだけ保持し、キー コンテナーへのリンクを持つ) をメモリ BLOB にエクスポートし、そのメモリ BLOB を .PFX ファイルに保存できます。
  7. 手順 3 で作成したキー コンテナーを削除する必要があります。これを行うには、CryptAcquireContextオプションCRYPT_DELETEKEYSETを使用してキー コンテナーを開く必要があります。
于 2012-09-14T08:49:12.887 に答える