我使用 Let's Encrypt 颁发的 SSL 证书来处理 NodeJS 服务器。它在某些客户端上运行良好(我的 macOS 上的 Safari 和 Firefox),但在其他客户端上不运行(curl
在我的 macOS 上,iOS 上的 Safari)。iOS 上的通知是:
Not trusted
Expired 30/09/21 07:01:15
通知内容curl
如下:
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option.
检查证书显示日期有效。我发现此警告来自 Let's Encrypt:
DST Root CA X3 根证书已于 2021 年 9 月 30 日 14:01:15 GMT 到期。
...
如果您的网站在大多数设备上运行正常,但在某些设备上运行不正常,则问题就出在他们的信任库(受信任的根证书列表)上。
...
macOS、iOS 等
即使您的服务器不再使用过期的 R3 > DST Root CA X3 链,某些操作系统也会保留该链。请尝试重新启动受影响的客户端设备。
我强制更新了证书,将私钥和完整链复制到 NodeJS 位置,然后重启了服务器。我重启了 iOS 设备。新日期显示在我的浏览器和 iOS 设备上。但 iOS 设备仍然不信任该网站。
如何确保所有客户端都获得正确的证书链并可以访问网站?
答案1
由于您无法控制您的客户端,因此最安全的方法是开始使用其他 CA 颁发的证书。
一个可能的 CA 是 ZeroSSL (https://zerossl.com)。他们还通过 ACME 协议免费提供证书,就像 Let's Encrypt 一样(https://zerossl.com/letsencrypt-alternative/)并且与旧设备具有相当好的兼容性(https://help.zerossl.com/hc/en-us/articles/360058294074-ZeroSSL-Compatibility-List)。
如果您已经在使用 certbot 命令行工具来管理您的 Let's Encrypt 证书,那么您可以向其中添加一些额外的开关来开始颁发 ZeroSSL 证书:
$ certbot ... --server https://acme.zerossl.com/v2/DV90 --eab-kid XXX --eab-hmac-key YYY
您可以在注册自己的账户后从 ZeroSSL 网站获取--eab-kid
和值。--eab-hmac-key