使用CryptoAPI从PFX证书获取X509数据

Get the X509 data from a PFX certificate using CryptoAPI

本文关键字:获取 X509 数据 证书 PFX CryptoAPI 使用      更新时间:2023-10-16

大家好。Stackoverflow以前已经帮助过我很多次了,但是我在这个问题上有点卡住了,希望有人能给我一些指点。

背景:我需要将证书的X509数据传递给Adobe的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参数指定了一个未知的数值。

根据文档:

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

我做错了什么吗?是否有其他方法来获取x509数据?如有任何帮助,不胜感激。

问候,玛格达

看来我把问题弄得太复杂了。

hContext->pbCertEncoded
hContext->cbCertEncoded

会给我想要的数据。

仍然不明白为什么使用KP_CERTIFICATE不检索X509数据…