美好的一天。 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参数指定未知值编号。
根据docs:
KP_CERTIFICATE:pbData是接收已使用可分辨编码规则(DER)编码的X.509证书的缓冲区的地址。证书中的公钥必须与相应的签名或交换密钥匹配。
我做错了吗?有没有其他方法来获取x509数据? 任何帮助将不胜感激。
此致 玛格达
答案 0 :(得分:3)
看起来我的问题过于复杂。
hContext->pbCertEncoded
hContext->cbCertEncoded
会给我我想要的数据。
仍然不明白为什么使用KP_CERTIFICATE
没有检索X509数据......