Openssl的验证与链接的CA和链接证书

问题描述:

我有一个证书链为: root CA -> intermediate CA -> org CA -> client CertOpenssl的验证与链接的CA和链接证书

当我验证与CA的客户端证书为root CA -> intermediate CA -> org CA,它的工作原理:

$ cat org_1_ca/ca_crt.pem intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test123.pem $ openssl verify -CAfile /tmp/test123.pem client/client_crt.pem client_crt.pem: OK

但是,当我将我的客户证书链接到组织CA(org CA -> client Cert),并将其余链作为CA(root CA -> intermediate CA),但它不包含:

$ cat intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test12.pem $ openssl verify -CAfile /tmp/test12.pem client/org1_client_crt.pem client/org1_client_crt.pem: C = US, ST = CA, L = LA, O = PP, OU = TEST, CN = user error 20 at 0 depth lookup:unable to get local issuer certificate

这是根本错误的东西还是openssl verify不喜欢这样的东西?我尝试了与nginx和openssl connect相同的事情,那里没有运气。任何帮助表示赞赏。

+0

Stack Overflow是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://*.com/help/on-topic)。也许[超级用户](http://超级用户。com /)或[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)将是一个更好的地方。另请参阅[我在哪里发布有关Dev Ops的问题?](http://meta.stackexchange.com/q/134306) – jww

+0

好点,下次会多加注意! – Amir

openssl命令行verify操作如果多于一个给定读取只有一个证书,第一个,从给定为操作数的文件,或从每个文件。这与-CAfile -trusted -untrusted选项指定的文件不同,后者可以(通常包含)多个证书。

您的文件client/org1_client_crt.pem可能包含客户端证书和'org CA'证书,按照该顺序。只有客户端证书被使用,'org CA'证书被忽略,结果你没有一个有效的链来验证。

如果您想使用命令行来模拟/测试接收器(对于客户端证书,服务器)将执行的验证,请将叶证书作为操作数以及所有其他传输(链)证书提供给-untrusted,以及锚点加上信任库中的任何“已知”中介,无论是明确的还是默认的。

没有openssl connect操作;我假设你的意思是openssl s_client,包括-connect在内的选项,因为这是使用客户端证书链有意义的一个地方。选项s_client类似地只使用文件中的第一个证书。除了最新版本1.1.0之外,命令行上没有指定客户机链的选项,甚至在那里它也没有记录,因此您必须仔细阅读帮助信息或代码,尽管API /库很长支持这个你自己写的代码。

通过1.0.2,如果你想发送一个客户端证书的全连锁到服务器(你应该每个RFC),假设服务器请求客户端身份验证,这是不正常的,不是默认的nginx(其他),你必须使用一个技巧:供应都在信任需要客户链中的证书,除了到锚(一个或多个)需要验证服务器,或者使用-CAfile和/或-CApath明确,或使用(如果需要修改)默认信任库,除非您的openssl是较早的非RedHat版本,其中默认信任库仅在s_client s_server s_time中不起作用。

对于s_server中的服务器证书/链也是如此,只是几乎总是使用它,而不是非常少。