我在一台服务器上托管了一个 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)而出现问题?
答案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/