我有由 CA1 证书签名的客户端证书“A”。CA1 证书由根证书签名。
现在我有了 CA1 证书(可信)并收到了客户端证书(不可信)。在验证期间,我只需要使用 CA1(受信任)验证客户端证书的信任路径。我没有 /receive 根证书。
是否可以进行此验证?
我正在使用 Openssl 1.0.0g 版本库。如果有人知道如何做到这一点,请与我分享。
我有由 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 文档的更多详细信息:
verify_callback 函数用于控制设置 SSL_VERIFY_PEER 标志时的行为。它必须由应用程序提供并接收两个参数:preverify_ok 指示是否通过了相关证书的验证(preverify_ok=1)或未通过(preverify_ok=0)。x509_ctx 是指向用于证书链验证的完整上下文的指针。
从最深的嵌套级别(根 CA 证书)开始检查证书链,并向上工作到对等方的证书。在每个级别检查签名和颁发者属性。每当发现验证错误时,错误号都会存储在 x509_ctx 中,并在 preverify_ok=0 时调用 verify_callback。通过应用 X509_CTX_store_* 函数 verify_callback 可以找到有问题的证书并执行其他步骤(参见示例)。如果没有发现证书错误,则在进入下一个级别之前调用 verify_callback 并设置 preverify_ok=1。
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 握手终止并发出警报消息。