【问题标题】:CertCreateCertificateContext returns ASN1 bad tag value metCertCreateCertificateContext 返回 ASN1 遇到的错误标签值
【发布时间】:2010-12-15 01:33:45
【问题描述】:

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

调用如下所示:

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

这将返回 NULL 并且 GetLastError() 返回上述错误。

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

我做错了什么?

谢谢!

【问题讨论】:

  • 更新:如果我导出为 DER 编码二进制 X.509(cer 文件),则函数成功。但是,当使用 CertCreateCertificateContext 的返回值调用 AcquireCredentialsHandle 时,我得到了一个错误。错误是:指定的登录会话不存在。它可能已经被终止了。
  • 请注意,安装证书后一切正常,我使用 CertFindCertificateInStore 通过系统证书存储打开它。我想要的是,不是在所有需要它的机器上安装证书,而是将它放在一个全局数据库中。然后我将从那里加载 BLOB 并使用 CertCreateCertificateContext。至少这是计划。

标签: c++ windows certificate


【解决方案1】:

尝试通过一些 asn.1 编辑器打开您的证书。

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

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

【讨论】:

【解决方案2】:

您必须改用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() 从存储中检索单个证书的证书上下文。

【讨论】:

  • 很抱歉,但我不明白 CertOpenStore 为何/如何替代 CertCreateCertificateContext:后者需要对存储句柄(之前通过 CertOpenStore 获得)进行操作以在该存储中添加证书。它们必须一起使用才能完成任务。在我看来,这个答案根本不适合这个问题。
  • 谢谢你的提醒。我已经编辑了我的答案,并提供了如何获得特定证书的进一步说明。 OP 并不清楚她/他到底想完成什么,是吗。
【解决方案3】:

确保证书是二进制格式。

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

您可以在 Windows 上轻松地做到这一点,方法是手动导入证书存储,然后使用所需的格式导出。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 2019-10-17
    • 2013-02-24
    • 2017-03-05
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多