3

証明書をpfxファイルにエクスポートしようとしています。これが私がすることです(簡略化):

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

2 に答える 2

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

これは、秘密鍵を証明書に添付するために私が見つけた唯一の方法です。

于 2009-04-15T18:59:34.827 に答える
0

後世のために:

問題はCertAddCertificateContextToStore通話に関連しています。CERT_KEY_PROV_HANDLE_PROP_ID実際、プロパティを次のコンテキストにコピーしません 。(この事実は備考に記載されています)

解決:

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

于 2015-03-01T09:40:00.423 に答える