【问题标题】:Associate private key to certificate for PFXExportCertStoreEx将私钥关联到 PFXExportCertStoreEx 的证书
【发布时间】:2009-04-14 22:56:31
【问题描述】:

我正在尝试将证书导出到 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 吗?将私钥附加到证书以便导出的正确方法是什么?

【问题讨论】:

    标签: cryptoapi pfx


    【解决方案1】:

    显然,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 之前完成。

    这是我发现将私钥附加到证书的唯一方法。

    【讨论】:

    • 这对我很有帮助。但是,当我使用 PFXImportCertStore 导入第三方 CA 颁发的 PFX 时,密钥会自动映射到 AT_KEYEXCHANGE 而不是 AT_SIGNATURE-,因为此证书的密钥用法表明它用于数字签名、密钥加密等,您是否克服了任何此类问题?谢谢
    • @Raj,对不起,我不记得我是否做过以及如何...这是不久前,我道歉
    • 非常感谢!我整天都在寻找解决方案!
    【解决方案2】:

    为了后代:

    问题与CertAddCertificateContextToStore 调用有关。 实际上,它不会将CERT_KEY_PROV_HANDLE_PROP_ID 属性复制到下一个上下文。 (这一事实在备注中注明)

    解决方案:

    用新上下文的句柄填充最后一个参数,并将属性从旧上下文复制到下一个。

    【讨论】:

    • 你能详细说明一下吗?你如何将属性复制到新的上下文中?为什么设置不起作用?谢谢。
    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2017-03-23
    • 2012-12-08
    • 2014-11-26
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多