Debian 9 上的客户端错误地报告 letsencrypt 颁发的域的证书已过期

Debian 9 上的客户端错误地报告 letsencrypt 颁发的域的证书已过期

如果我尝试从 debian 9 访问具有 certbot 颁发的证书的 HTTPS 服务器,我会收到以下错误:

 # curl -v https://hu.dbpedia.org/
 *   Trying 195.111.2.82...
 * TCP_NODELAY set
 * Connected to hu.dbpedia.org (195.111.2.82) port 443      (#0)
 * ALPN, offering h2
 * ALPN, offering http/1.1
 * Cipher selection:      ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
 * successfully set certificate verify locations:
 *   CAfile: /etc/ssl/certs/ca-certificates.crt
   CApath: /etc/ssl/certs
 * TLSv1.2 (OUT), TLS header, Certificate Status (22):
 * TLSv1.2 (OUT), TLS handshake, Client hello (1):
 * TLSv1.2 (IN), TLS handshake, Server hello (2):
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
 * TLSv1.2 (OUT), TLS alert, Server hello (2):
 * SSL certificate problem: certificate has expired
 * Curl_http_done: called premature == 1
 * stopped the pause stream!
 * Closing connection 0
 curl: (60) SSL certificate problem: certificate has expired

但是,如果我从 debian 10 尝试相同的命令,它会成功。

我尝试使用 rsync 将所有 ca 证书从 debian 10 VM 复制到 debian 9 VM(复制到 /usr/local/share/ca-certificates),然后运行,update-ca-certificates似乎添加了 400 多个证书。不幸的是,这没有帮助。这并不奇怪,因为似乎 debian 9 和 10 上都有相同的证书。

我的问题是:如何从 debian 9 机器访问具有 certbot 证书的网站无需完全忽略证书验证

答案1

首先,Debian 9 已停产。但由于客户端可能不在您的控制范围内,您当然可能希望尝试在此中断中迎合他们。

我认为,虽然问题仅提到了certbot,但它实际上是专门针对 Letsencrypt 的。
(该工具certbot本身是一个 ACME 协议客户端,也与其他基于 ACME 的 CA 一起使用,因此这里可能会引起混淆。)

当前的问题似乎是以下几点的组合:

  • 旧的 Letsencrypt 根 (“DST Root CA X3”) 已过期
  • 新的默认LE chain 力图实现“额外兼容”通过提供链的可选扩展,其中新根(“ISRG Root X1”)作为旧根的交叉签名中间体(因为非常旧的 Android 版本仍然接受过期的根,但没有新的根)
  • Openssl 1.0 有一个错误导致它只尝试看到的第一个链,如果它不喜欢,它就不会考虑任何其他可能性(即,以 X1 结尾的较短的新链与通过 X1 到 X3 的该链的较长的“兼容性”扩展)。
  • Debian 9 上的 libcurl3与 libssl 1.0 链接

如果您提供不尝试额外兼容的新 LE 证书链,只是以新的根(X1)结束,它允许 libssl 1.0 工作(但您会失去与真正旧的 Android 的兼容性)。

除此之外,其他 CA(ACME 或其他)可能是值得考虑的选择。

答案2

警告!请规划操作系统升级路径。以下建议应仅在紧急情况下应用,以快速修复关键系统。

以下解决方案适用于 Debian Jessy 8 ,也适用于 Stretch 9 缺失的更新。我刚刚在 上测试过docker run -it debian:jessie bashapt-get update && apt-get install curl

前:

# curl -I https://hu.dbpedia.org
curl: (60) SSL certificate problem: certificate has expired
More details here: http://curl.haxx.se/docs/sslcerts.html
....

首先检查是否存在有问题的 DST Root CA X3 证书:

# grep X3 /etc/ca-certificates.conf 
mozilla/DST_Root_CA_X3.crt

旧的 Debian 版本也具有正确的 ISRG Root X1:

# grep X1 /etc/ca-certificates.conf 
mozilla/ISRG_Root_X1.crt

这将禁用 X3:

# sed -i '/^mozilla\/DST_Root_CA_X3/s/^/!/' /etc/ca-certificates.conf && update-ca-certificates -f

您的域名对 curl 的响应很好:

# curl -I https://hu.dbpedia.org/
HTTP/1.1 200 OK
...

再次,请计划升级。

答案3

对于 Debian 8 和 9,我只需执行此操作即可更新主机上的证书,并且不再出现错误 60:SSL 证书问题:证书已过期: https://github.com/xenetis/letsencrypt-expiration

只需运行,它就可以工作:

wget -O - https://raw.githubusercontent.com/xenetis/letsencrypt-expiration/main/letsencrypt-expiration.sh | bash

答案4

我刚刚在使用基于 Debian Stretch 的 Docker 镜像时遇到了这个问题。解决方案很简单,我想 Debian 已经libssl1.0.2修补了 Håkan 提到的链选择问题。就我而言,只需更新证书并libssl1.0.2运行apt install -y libssl1.0.2 ca-certificatesapt update事先使用 for 容器)就足够了。

相关内容