openssl - 如何使用受信任的中间 CA 证书验证客户端证书?

标签 openssl ssl-certificate digital-certificate client-certificates

我有由 CA1 证书签名的客户端证书“A”。 CA1 证书由根证书签署。

现在我有 CA1 证书(受信任)并收到客户端证书(不受信任)。在验证期间,我需要仅使用 CA1(受信任)验证客户端证书的信任路径。我没有/receive 根证书。

是否可以进行此验证?

我正在使用 Openssl 1.0.0g 版本库。如果有人知道如何做到这一点,请与我分享。

最佳答案

因为,你已经给了标签,ssl-certificate ,我假设您在服务器证书验证或客户端证书验证的 SSL 连接期间需要这样的验证。

实现此目的的简单方法是使用 OpenSSL API 设置验证回调 SSL_CTX_set_verify .

要点是,每次在证书验证过程中遇到错误时都会调用此回调,因此在您的情况下,当找不到 root 时,将使用错误 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 调用此回调。 .您还可以访问 X509_STORE_CTX *您可以从中获取迄今为止已验证的证书的详细信息。使用这种机制,您可以在代码中实现适当的逻辑,以查看您的最终实体和中间 CA 证书是否正确,如果发现正确,您可以从回调中返回成功,这将向 OpenSSL 发出信号以继续验证没有失败的验证。

OpenSSL 文档中的更多详细信息:

当设置 SSL_VERIFY_PEER 标志时,verify_callback 函数用于控制行为。它必须由应用程序提供并接收两个参数: preverify_ok 指示相关证书的验证是否通过 (preverify_ok=1) 或未通过 (preverify_ok=0)。 x509_ctx 是指向用于证书链验证的完整上下文的指针。

从最深的嵌套级别(根 CA 证书)开始检查证书链,并向上工作到对等方的证书。在每个级别检查签名和发行者属性。每当发现验证错误时,错误号就会存储在 x509_ctx 中,并使用 preverify_ok=0 调用 verify_callback。通过应用 X509_CTX_store_* 函数 verify_callback 可以定位有问题的证书并执行其他步骤(参见示例)。如果没有发现证书错误,则在进入下一个级别之前,使用 preverify_ok=1 调用 verify_callback。

verify_callback 的返回值控制着进一步验证过程的策略。如果 verify_callback 返回 0,则验证过程立即停止并显示“验证失败”状态。如果设置了 SSL_VERIFY_PEER,则会向对等方发送验证失败警报​​并终止 TLS/SSL 握手。如果 verify_callback 返回 1,则继续验证过程。如果 verify_callback 始终返回 1,则不会因验证失败而终止 TLS/SSL 握手,并且将建立连接。然而,调用进程可以使用 SSL_get_verify_result(3) 或通过维护由 verify_callback 管理的自己的错误存储来检索上次验证错误的错误代码。

如果未指定 verify_callback,则将使用默认回调。它的返回值与 preverify_ok 相同,因此如果设置了 SSL_VERIFY_PEER,任何验证失败都将导致 TLS/SSL 握手终止并带有警报消息。

关于openssl - 如何使用受信任的中间 CA 证书验证客户端证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218055/

相关文章:

c++ - 使用什么来检查特定的 EXE 文件签名?

java - 无法将 ltv 添加到 PDF 文档。错误

c++ - 如何使用具有低级 DES 函数的 openssl EVP 库?

c++ - openssl 以编程方式签名和加密有何不同

openssl - openssl无法生成具有有效别名的pfx

c - 加密字符串与测试 vector 不同

asp.net - 远程证书被用户验证为无效

internet-explorer-9 - IE9如何追踪 "Internet explorer blocked this website from displaying content with security certificate errors."

ssl - Jupyterhub 子域和多个 ssl 证书

c# - 具有有限用户升级功能的数字签名 MSI 仍会提示管理员