我有客户证书“A”,由CA1证书签名。 CA1证书由根证书签名。
现在我拥有CA1证书(可信)并收到客户端证书(不受信任)。在验证期间,我需要使用CA1(可信)来验证客户端证书的信任路径。我没有/接收根证书。
是否可以进行此验证?
我正在使用Openssl 1.0.0g版本库。如果有人知道该怎么做,请与我分享。
答案 0 :(得分: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)(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握手终止并发出警报消息。