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

5

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

现在,我已经拥有了CA1证书(受信任)和收到了客户端证书(非受信任)。在验证期间,我需要仅使用CA1(受信任)来验证客户端证书的信任路径。我没有/收到根证书。

这种验证是否可能?

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


可能有帮助:https://dev59.com/j2rXa4cB1Zd3GeqPA5_u - JSuar
2Balamurugan:非常抱歉,我之前回答的内容是错误的。我已经将其删除了。我检查了“openssl verify”的参数,看起来它需要整个证书链。 - Victor Ronin
顺便问一下,为什么不能离线获取根证书并将其连接到CA1证书(以使验证正常工作)?当您可以访问CA1证书但无法访问根证书时,有哪些测试用例? - Victor Ronin
@Victor Ronin 这是一个我需要支持的异常情况。 - Balamurugan
1个回答

3
由于您提供了标签ssl-certificate,我假设您需要在SSL连接期间进行服务器证书验证或客户端证书验证。
使用OpenSSL API SSL_CTX_set_verify设置验证回调是实现这一点的简单方法。
要点是,在证书验证期间遇到错误时,此回调将被调用,因此在您的情况下,当找不到根时,该回调将以错误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握手终止并显示警报消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接