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

Bal*_*gan 5 openssl digital-certificate client-certificates ssl-certificate

我有客户证书"A",由CA1证书签名.CA1证书由根证书签名.

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

是否可以进行此验证?

我正在使用Openssl 1.0.0g版本库.如果有人知道该怎么做,请与我分享.

Jay*_*Jay 3

由于您已经给出了标签 ,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 可以找到有问题的证书并执行其他步骤(请参阅示例)。如果没有发现证书错误,则在进入下一个级别之前使用 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 握手终止并发出警报消息。