【问题标题】:Why does SSL connection fails when using intermediate CA?为什么使用中间 CA 时 SSL 连接失败?
【发布时间】:2020-05-05 17:07:33
【问题描述】:

给定 stackoverflow.com 证书链如下:

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

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

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

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

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

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

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

【问题讨论】:

  • 这可能会有所帮助:crypto.stackexchange.com/questions/63907/… 但否则你的问题在这里与编程无关。
  • "是不是因为在 TLS 握手时中间 CA 出现在了服务器链中?"服务器必须提供证书链。他们只允许跳过根目录,因为无论如何客户端都应该在自己的信任库中拥有它。
  • “或者链中的所有证书都必须由受信任的机构直接或传递地签名吗?”如果你有一个证书链,这意味着每个证书都由“前一个”证书签名,这样你就有了一个完整的链接,即一个链。根据您查看的方向,其中一个将由最终受客户端信任的根 CA 签名,其中一个(相同或另一个,取决于中间链是否只有一个或多个证书)将签名最终用户证书。这样您就拥有了从受信任的 CA 到端点证书的完整链。
  • @PatrickMevzek 是的,我知道这个理论,但是将中间 CA 指向客户端最终受信任有什么问题?

标签: ssl curl openssl ssl-certificate x509certificate


【解决方案1】:

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

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

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

【讨论】:

  • 这正是我想要的。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2014-05-07
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多