C++ CertCreateCertificateContext返回满足的ASN1错误标记值

C++ CertCreateCertificateContext返回满足的ASN1错误标记值,c++,windows,certificate,C++,Windows,Certificate,我正在将一个.p7b证书文件加载到内存中,然后对其调用CertCreateCertificateContext,但它失败了,错误为“ASN1 bad tag value met.” 电话如下所示: m_hContext=CertCreateCertificateContext(X509_ASN_编码| PKCS_7_ASN_编码,pbCertEncoded,dwCertEncodedLen) 这将返回NULL,GetLastError()将返回上述错误 我通过将证书从IE中的设置中拖出来创建证书

我正在将一个.p7b证书文件加载到内存中,然后对其调用CertCreateCertificateContext,但它失败了,错误为“ASN1 bad tag value met.”

电话如下所示:

m_hContext=CertCreateCertificateContext(X509_ASN_编码| PKCS_7_ASN_编码,pbCertEncoded,dwCertEncodedLen)

这将返回NULL,GetLastError()将返回上述错误

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

我做错了什么


谢谢

尝试通过某个asn.1编辑器打开您的证书

可能您的证书导出不正确,或者您传递给api的证书大小错误。。。而是第二个选项(证书构造或传递不正确)


我发现您尝试使用的编码信息不完全受支持(请参阅可能的错误值)。

您必须使用
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:

证书存储文件名 使用文件中的证书、CRL和CTL初始化存储。提供者打开文件,首先尝试将文件作为序列化存储读取,然后作为PKCS#7签名消息读取,最后作为单个编码证书读取


打开证书存储后,可以使用
CertEnumCertificateSinstare()
从存储中检索各个证书的证书上下文。

确保证书为二进制格式

当证书是“Base-64编码的X.509”时,我也有类似的问题。 当我在“DER编码二进制X.509”中使用相同的证书时,它被修复了

您可以在windows上轻松地执行此操作,方法是手动导入到cert store,然后使用所需的格式导出


然后,可以使用winapi函数将证书安装到其他计算机上。

更新:如果我将其导出为DER编码的二进制X.509(cer文件),则函数将成功。但是,当使用CertCreateCertificateContext的返回值调用AcquireCredentialsHandle时,我得到了一个错误。错误是:指定的登录会话不存在。它可能已被终止。请注意,安装证书后一切正常,我使用CertFindCertificateInStore通过系统证书存储打开它。我想要的是,我不会在所有需要证书的机器上安装证书,而是将它放在一个全局数据库中并保存。然后我将从那里加载BLOB并使用CertCreateCertificateContext。至少这是计划。@user72185如果这不能解决您的问题,为什么它会被标记为答案?什么解决了您的问题?@JohnLeidegren我怀疑使用DER格式证书解决了他/她的问题,很抱歉,但我不明白CertOpenStore为什么/如何替换CertCreateCertificateContext:后者需要对存储句柄(以前使用CertOpenStore获得)进行操作,以便在该存储中添加证书。他们必须一起使用来完成任务。在我看来,这个答案根本不适合这个问题。谢谢你提醒我。我已经编辑了我的答案,并进一步说明了如何获得特定证书。OP不清楚她/他到底想要实现什么,是吗。