为什么使用中间 CA 时 SSL 连接失败?

Why does SSL connection fails when using intermediate CA?

给定 whosebug.com 证书链如下:

Builtin DST Root CA -> Let's encrypt intermediate CA -> *.stackexchange.com

是否可以使用中间 CA 作为可信 CA 建立 TLS 连接?

curl https://whosebug.com -v --cacert stack_intermediate_ca.pem --capath /dev/null -o /dev/null

curl: (60) SSL certificate problem: unable to get issuer certificate

是不是因为中间CA在TLS握手时出现在服务器链中?还是链中的所有证书都必须由受信任的机构直接或传递地签署?

我验证了中间 CA 在 Basic Constraints 属性中设置了 Is a Certification Authority

也许受信任的 CA 必须是自签名的,而中间 CA 则不是这样。

这里的行为取决于 openssl 和 curl 的版本。

传统上 openssl 需要验证整个链,即直到自签名和本地信任的根证书。在 openssl 1.0.2 中添加了 X509_V_FLAG_PARTIAL_CHAIN 标志,这允许链验证以任意可信证书结束,无论它是否是自签名根证书。但默认情况下此行为是关闭的。

对于 curl 7.68.0,curl 默认启用此标志,因此对于较新版本的 curl 和 openssl,应该可以在 --cacert 中使用链证书而不是自签名根证书.服务器是否会发送比验证链所需的更多的链证书并不重要,因为 curl/openssl 将只使用实际需要的证书。使用 curl 7.68.0 和 openssl 1.1.1 在 Ubuntu 20.04.

上验证