【问题标题】:Get the X509 data from a PFX certificate using CryptoAPI使用 CryptoAPI 从 PFX 证书中获取 X509 数据
【发布时间】:2013-05-02 20:03:18
【问题描述】:

美好的一天。之前stackoverflow帮了我很多次,但是我在这个上有点卡住了,希望有人能给我一些指点。

背景:我需要将证书的 X509 数据传递给 Adob​​e 的 SDK CertListCab,以便使用我的 Acrobat 插件 api 签署 PDF。

我的问题是如何使用 CryptoAPI 从 PFX 证书中获取 X509 数据?

我做了以下事情:

  • 将我的 PFX 证书转换为内存存储。

    CRYPT_DATA_BLOB data;

  • 打开文件并填充数据。

    FILE *fIn = fopen("C:\\certificate\\MyPfx.pfx", "rb")
        fseek(fIn, 0, SEEK_END);
        data.cbData = ftell(fIn);
        fseek(fIn, 0, SEEK_SET);
        data.pbData = (BYTE *)malloc(data.cbData);
        fread(data.pbData, 1, data.cbData, fIn);
        fclose(fIn);
    

    HCERTSTORE hCertStore = PFXImportCertStore(&data, L"password", 0);

  • 找到证书。只有一个。

    PCCERT_CONTEXT hContext = CertFindCertificateInStore (hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);

  • 获取证书的公钥信息。

    BOOL bFreeHandle; HCRYPTPROV hProv; DWORD dwKeySpec; HCRYPTKEY hCertPubKey; CryptAcquireCertificatePrivateKey (hContext, 0, NULL, &hProv, &dwKeySpec, &bFreeHandle);

    CryptImportPublicKeyInfo(hProv, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &hContext->pCertInfo->SubjectPublicKeyInfo, &hCertPubKey));

  • 现在我尝试为 X509 数据腾出空间。

    DWORD dwX509Len; BYTE *x509Data; CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,NULL,&dwX509Len,0);

    x509Data = (BYTE*)malloc(dwX509Len);

  • 我传入我的缓冲区。

    CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,x509Data,&dwX509Len,0);

当我运行我的程序时,我收到 CryptGetKeyParam 的错误:

NTE_BAD_TYPE : dwParam 参数指定了一个未知数值。

根据docs:

KP_CERTIFICATE :pbData 是接收已使用可分辨编码规则 (DER) 编码的 X.509 证书的缓冲区的地址。证书中的公钥必须与对应的签名或交换密钥匹配。

我做错了吗?还有另一种获取x509数据的方法吗? 任何帮助将不胜感激。

问候, 玛格达

【问题讨论】:

    标签: c++ x509 cryptoapi pfx


    【解决方案1】:

    看来我把问题复杂化了。

    hContext->pbCertEncoded
    hContext->cbCertEncoded
    

    会给我我想要的数据。

    还是不明白为什么使用KP_CERTIFICATE没有检索到X509数据...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2022-12-17
      • 2018-03-13
      • 2014-10-25
      • 1970-01-01
      相关资源
      最近更新 更多