TLS 相互验证:空证书链(C 客户端 -> Java 服务器)除非 cafile 指向与证书相同的文件

TLS Mutual Auth: null cert chain (C client -> Java server) unless cafile points to same file as cert

如果我仅使用证书(带链)和私钥发出 openssl 调用,我会遇到服务器拒绝握手中的客户端证书的问题。

如果我还设置了 cafile 参数并将其指向与证书相同的文件,这个问题就会消失。

即使信息已经在证书输入中,openssl 似乎也无法在没有 cafile 输入的情况下构建链。我想知道你们是否有这方面的经验。我只是觉得有点奇怪。

总而言之,这有效:

sudo openssl s_client -connect <ip>:<port> -cert cert_with_chain.pem -key privkey.pem -CAfile cert_with_chain.pem

这不起作用(服务器拒绝 "null cert chain"):

sudo openssl s_client -connect <ip>:<port> -cert cert_with_chain.pem -key privkey.pem

打开 SSL 版本:

OpenSSL 1.0.2k-fips  26 Jan 2017

问题不在于 "openssl cannot construct the chain without the cafile",而是一开始就没有这样做的意图。 man s_client:

中详细记录了预期的行为

-cert certname
The certificate to use, if one is requested by the server.

-CAfile file
A file containing trusted certificates to use during server authentication and to use when attempting to build the client certificate chain.