2009-04-14 33 views
2

証明書をpfxファイルにエクスポートしようとしています。ここで私は何をしているのですか(簡略化):PFXExportCertStoreExの証明書に秘密鍵を関連付けます。

h = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, NULL); 
p = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 
        CertBlob.pbData, CertBlob.cbData); 
CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID, 0, &hPrivKey); 
CertAddCertificateContextToStore(h, p, CERT_STORE_ADD_ALWAYS, NULL); 
PFXExportCertStoreEx(h, &SomeBlob, L"", NULL, EXPORT_PRIVATE_KEYS); 

PFXが作成されましたが、秘密鍵はエクスポートされていません。誰もpfxに秘密鍵をエクスポートしたことがありますか?証明書に秘密鍵を添付してエクスポートできる適切な方法は何ですか?

答えて

4

どうやら、CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID ...)

は良くありません。

CRYPT_KEY_PROV_INFO kpi; 
ZeroMemory(& kpi, sizeof(kpi)); 
kpi.pwszContainerName = "my-container-name"; 
kpi.dwProvType = PROV_RSA_FULL; 
kpi.dwKeySpec = AT_KEYEXCHANGE; 
kpi.dwFlags = CRYPT_MACHINE_KEYSET; 
CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, 0, & kpi); 

実際のキーを生成するために使用された情報は、プロバイダ名や他のひどいものと一致することが重要です。プロバイダのハンドルやそのようなものを設定する必要はありません。また、CertAddCertificateContextToStoreの前に行う必要があります。

これは証明書に秘密鍵を添付するための唯一の方法です。後世のために

+0

これは本当に私を助けました。しかし、PFXImportCertStoreを使用してサードパーティのCA発行のPFXをインポートすると、鍵はAT_SIGNATURE-ではなくAT_KEYEXCHANGEに自動的にマッピングされます。この証明書の鍵となる使用法は、デジタル署名、鍵の暗号化などを示しています。ありがとう – Raj

+0

@Raj、申し訳ありませんが、私がやったかどうか覚えていない...それはしばらく前に、私は謝罪 – galets

+0

ありがとうたくさん!私は1日中ソリューションを探していました! –

0

問題はCertAddCertificateContextToStoreコールに関連しています。 実際、CERT_KEY_PROV_HANDLE_PROP_IDプロパティは次のコンテキストにコピーされません。 (この事実は、発言に注目されたい)

ソリューション:

新しいコンテキストへのハンドルで最後のパラメータを記入し、次のいずれかに古いコンテキストからプロパティをコピーします。

関連する問題