我正在将.p7b证书文件加载到内存中,然后在其上调用CertCreateCertificateContext,但它失败并显示错误“ASN1错误标记值已达到。”。
电话看起来像这样:
m_hContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,pbCertEncoded,dwCertEncodedLen);
返回NULL,GetLastError()返回上述错误。
我通过从IE中的设置中拖出证书来创建证书文件,然后自动导出到文件。
我做错了什么?
谢谢!
答案 0 :(得分:0)
尝试通过asn.1编辑器打开证书。
可能您的证书导出不正确或者您传递给api的证书大小错误...而是第二个选项(不正确的证书构建或传递)。
我发现here信息表明您尝试使用的编码不完全受支持(请参阅可能的错误值)。
答案 1 :(得分:0)
您必须改为使用CertOpenStore()
:
HCERTSTORE hCertStore = CertOpenStore(
CERT_STORE_PROV_FILENAME,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
NULL,
CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,
pszFilePath));
CertCreateCertificateContext()
仅支持一个证书,而PKCS#7文件可以包含许多证书。
来自MSDN:
CERT_STORE_PROV_FILENAME 使用文件中的证书,CRL和CTL初始化存储。提供程序打开文件,首先尝试将文件读取为序列化存储,然后作为PKCS#7签名消息,最后作为单个编码证书。
证书存储区打开后,您可以使用CertEnumCertificatesInStore()
从商店中检索单个证书的证书上下文。
答案 2 :(得分:0)
确保证书是二进制格式。
当证书处于“Base-64编码的X.509”时,我遇到了类似的问题。 当我在“DER编码二进制X.509”
中使用相同的证书时,它被修复了您可以通过手动导入到证书存储区然后使用所需格式导出,在Windows上轻松完成此操作。
然后可以使用winapi函数将证书安装在其他计算机上。