【问题标题】:Openssl verify with chained CA and chained CertOpenssl 使用链式 CA 和链式证书进行验证
【发布时间】:2017-11-06 14:27:18
【问题描述】:

我有一个证书链: root CA -> intermediate CA -> org CA -> client Cert

当我使用 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

但是当我将我的客户端证书与 org 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 尝试了同样的事情,但没有运气。任何帮助表示赞赏。

【问题讨论】:

标签: ssl nginx openssl certificate certificate-authority


【解决方案1】:

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

您的文件client/org1_client_crt.pem 大概按顺序包含客户端证书和“org CA”证书。仅使用客户端证书,忽略“org CA”证书,因此您没有要验证的有效链。

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

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

如果您想通过 1.0.2 向服务器发送具有完整链的客户端证书(正如您应该按照 RFC 那样),假设服务器请求客户端身份验证,这是不常见的,也不是 nginx(以及其他)的默认设置,您必须使用一个技巧:在 truststore 中提供客户端链所需的所有证书,此外 还需要验证服务器所需的锚点,或者显式使用-CAfile 和/或-CApath,或使用(如果需要,修改)默认信任库,除非您的openssl 是较旧的非RedHat 版本,其中默认信任库仅在s_client s_server s_time 中不起作用。

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

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 2021-07-22
    • 2013-04-23
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2020-06-26
    • 2021-05-12
    • 2011-10-16
    相关资源
    最近更新 更多