我有一个托管在服务器上的 gitlab 社区版,当在此服务器上使用 curl 获取此本地 gitlab 网站时,即使日期有效,我也会收到过期证书错误:
curl --insecure -vvI https://gitlab.mysite.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'
* Server certificate:
* subject: CN=gitlab.mysite.com
* start date: Nov 12 14:36:12 2021 GMT
* expire date: Feb 10 14:36:11 2022 GMT
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify result: certificate has expired (10), continuing anyway.
但是从浏览器加载站点或在另一台服务器上使用 curl 时,我没有收到此过期证书错误。该错误仅在托管 gitlab ce 实例的服务器上本地使用 curl 时出现。
这是在另一台服务器上使用 curl 时的结果:
* Server certificate:
* subject: CN=gitlab.mysite.com
* start date: Nov 12 14:36:12 2021 GMT
* expire date: Feb 10 14:36:11 2022 GMT
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
由于 curl 正在解析到本地网站(已解析 ip = 127.0.1.1),是否可能存在问题?
我在我的 Ubuntu 16.04 机器 curl 7.47.0 上出现了这些症状(在浏览器上工作,在 Curl 上失败)。
在我的例子中,这个问题确实是由 Let's Encrypt 过期的证书(如 Bob 提到的)触发的,但实际上是由OpenSSL 处理多路径证书树的一个错误造成的。
Ubuntu 16.04
OpenSSL 上的这个问题已在 Ubuntu 16.04 软件包的 1.0.2g-1ubuntu4.20 版本(截至今天的最新版本)上进行了修补(请参阅此处的更改日志)。
如果您使用的是 Ubuntu 16.04,请尝试将 OpenSSL 更新到最新版本。如果您在其他系统上,请检查您的 OpenSSL 版本。1.1.x 之前的版本存在问题并且需要“修补”(就像上面提到的 Ubuntu 发行版所做的那样)。如果您无法转而使用带有修复程序的 OpenSSL 版本,则可以求助于禁用导致问题的证书。如何禁用证书将因您的操作系统/发行版而异。
Debian 9.3
(更新的答案 - 一旦 OP 将操作系统识别为 Debian 9.3)
似乎对于 Debian 9.3 这将是一个重复的问题(我没有足够的权限将其标记为这样)。
Debian 9 上的客户端错误地报告letsencrypt 颁发的域的过期证书
并且OP 成功应用了这个答案(这相当于我上面对Ubuntu 16.04 的建议):
https ://serverfault.com/a/1080278/473319
更多信息
以下页面可以提供更多背景信息和指针,以更好地理解问题。https://scotthelme.co.uk/lets-encrypt-old-root-expiration/