使用CryptoAPI从PFX证书获取X509数据
Get the X509 data from a PFX certificate using CryptoAPI
大家好。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数据…
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 获取X509代码签名证书的序列号,以不受管理的C/C 签名
- 有没有办法获取 OpenSSL X509 证书名称,该证书名称将在 C++ 中发送到对等方
- 从X509*获取主题和发行人信息
- 使用CryptoAPI从PFX证书获取X509数据