5

我有由CA1证书签名的客户端证书“A”。 CA1证书由根证书签名。如何使用可信中介CA证书验证客户端证书?

现在我拥有CA1证书(可信任)并收到客户端证书(不可信任)。在验证过程中,我需要使用CA1(受信任)验证客户端证书的信任路径。我没有/收到根证书。

是否可以做这个验证?

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

+0

可能会有所帮助:http://stackoverflow.com/questions/13295585/openssl-certificate-verification-on-linux – JSuar

+0

2Balamurugan:对不起。我在我发布的答案中错了。我删了它。我检查了“openssl verify”的参数,看起来它需要整个证书链。 –

+0

顺便说一句。一个问题。为什么不能让根证书脱机并将其连接到CA1证书(以使验证工作正常)。当您有权访问CA1证书但无权访问根证书时,测试用例是什么? –

回答

2

由于您已给出标记ssl-certificate,我假设您在SSL连接期间需要进行此类验证以进行服务器证书验证或客户端证书验证。

通过使用OpenSSL API SSL_CTX_set_verify设置验证回调来实现此目的的一种简单方法。

要点在于,每次在证书验证期间遇到错误时都会调用此回调函数,因此在您的情况下,如果找不到root用户,则会调用此回调函数,并显示错误X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT。您还可以访问X509_STORE_CTX *,您可以从中获取迄今已验证的证书的详细信息。使用这种机制,您可以在代码中实现适当的逻辑,以查看您的End Entity和中间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握手。