CertCreateCertificateContext返回符合ASN1错误标记值

时间:2009-11-10 14:20:19

标签: c++ windows certificate

我正在将.p7b证书文件加载到内存中,然后在其上调用CertCreateCertificateContext,但它失败并显示错误“ASN1错误标记值已达到。”。

电话看起来像这样:

m_hContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,pbCertEncoded,dwCertEncodedLen);

返回NULL,GetLastError()返回上述错误。

我通过从IE中的设置中拖出证书来创建证书文件,然后自动导出到文件。

我做错了什么?

谢谢!

3 个答案:

答案 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函数将证书安装在其他计算机上。