如果我尝试从 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 bash
。apt-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-certificates
(apt update
事先使用 for 容器)就足够了。