如果我尝试从 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-certificates 从 debian 10 VM 复制到 debian 9 VM(到 /usr/local/share/ca-certificates),然后运行update-ca-certificates
似乎添加了 400 多个证书。不幸的是,它没有帮助。这并不奇怪,因为显然 debian 9 和 10 上似乎有相同的证书。
我的问题是:如何在不完全忽略证书验证的情况下从 debian 9 机器访问带有 certbot 证书的站点
首先,Debian 9 已停产。但由于客户可能不受您的控制,您当然可能想在这种破坏中迎合他们。
我认为虽然问题只提到
certbot
了,但它实际上是关于 Letsencrypt 的。(该工具
certbot
本身是一个 ACME 协议客户端,它也与其他基于 ACME 的 CA 一起使用,因此这里有一些混淆的空间。)手头的问题似乎是以下组合:
如果您改为提供不尝试额外兼容的新 LE 证书链,只是在新根 (X1) 处结束,它允许 libssl 1.0 工作(但随后您会失去与真正旧 Android 的兼容性)。
除此之外,其他 CA(ACME 或其他)可能是可以考虑的选项。
警告!请规划操作系统升级路径。以下建议应仅在紧急情况下应用,以快速修复关键系统。
以下解决方案适用于 Debian Jessy 8,也应该适用于 Stretch 9 缺少更新。我刚刚在
docker run -it debian:jessie bash
,上测试过apt-get update && apt-get install curl
。前:
首先检查您是否存在违规的 DST Root CA X3 证书:
旧的 Debian 版本也有正确的 ISRG Root X1:
这将禁用 X3:
您的域对 curl 的响应很好:
再次,请计划升级。
DST 根 CA X3 根证书于 2021 年 9 月 30 日 14:01:15 GMT 过期。它被用作 Let's Encrypt 证书的认证路径之一 旧 cURL 版本有一个错误,会导致过期的根连接失败,而不是尝试本地 ca 存储中的其他根。
截至 2021 年 9 月 30 日,用于 curl 的 ca 存储 ( https://curl.se/docs/caextract.html ) 仍包含过期的 DST Root CA X3 根证书,因此更新它不会解决问题。您可以更新您的 cURL(在某些情况下可能非常具有挑战性)或编辑本地 ca 存储(fe /etc/pki/tls/certs/ca-bundle.crt)并在“DST Root CA X3”行之后手动删除证书
我刚刚在使用基于 Debian Stretch 的 Docker 映像时遇到了这个问题。解决方案很简单,我想 Debian 已经修补
libssl1.0.2
以修复 Håkan 提到的链选择问题。就我而言,仅更新证书并libssl1.0.2
通过运行apt install -y libssl1.0.2 ca-certificates
(apt update
预先使用容器)就足够了。对于 Debian 8 和 9,我这样做只是为了更新主机上的证书,不再出现错误 60:SSL 证书问题:证书已过期: https ://github.com/xenetis/letsencrypt-expiration
只需运行,它应该可以工作:
按照 Nicolo 的回答1,我在老化的 Debian 9 服务器上运行了脚本,但仍然收到相同的证书过期错误。
update-ca-certificates
手册页说截至今天,他共享的脚本将 ISRG & Let's Encrypt 证书下载为
.pem
文件,因此update-ca-certificates
不会自动包含它们。在对这些.pem
文件建立软链接但带有.crt
扩展名后,update-ca-certificates
再次运行确实包含它们并且过期的证书错误消失了。谢谢您的回答!