CertCreateCertificateContext返回符合ASN1的错误标记值

我正在加载一个.p7b证书文件到内存,然后调用CertCreateCertificateContext,但它失败,错误“ASN1坏标记值满足。”。

电话看起来像这样:

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

这返回NULL,并且GetLastError()返回上面提到的错误。

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

我究竟做错了什么?

谢谢!

尝试通过一些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引用:

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

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

确保证书是二进制格式。

当证书是“Base-64 encoded X.509”时,我遇到了类似的问题。 当我在“DER编码的二进制X.509”中使用相同的证书时,

您可以通过手动导入到证书存储区,然后使用所需的格式导出,从而轻松地在Windows上执行此操作。

然后可以使用winapi函数将证书安装在其他机器上。