我正在加载一个.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函数将证书安装在其他机器上。