这一问题在之前的文章中提到过,事实上,有不少人面临这个问题,期待有解决方案。在 StackExchange 上有一贴,大致译制至此,以备后用。
回复一。找一台新版本的苹果电脑,打开钥匙串访问,选择“系统根”,将其导出为名为 rootcerts.pem
的文件,复制到古董机上。将以下脚本保存为名为trustroot
的文件,赋予其执行权限后,用 sudo
命令执行它,如 sudo ./trustroot rootcerts.pem
。
1 2 3 4 5 6 7 8 9 |
#!/bin/bash DIR=${TMPDIR}/trustroot.$$ mkdir -p ${DIR} trap "rm -rf ${DIR}" EXIT cat "$1" | (cd $DIR && /usr/bin/split -p '-----BEGIN CERTIFICATE-----' - cert- ) for c in ${DIR}/cert-* ; do security -v add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" "$c" done rm -rf ${DIR} |
脚本所做的是将 .pem 文件拆分为临时目录中的多个证书,然后将它们作为 trustRoot 证书添加到系统钥匙链中;然后,它们将作为除原始“系统根”钥匙链中的证书之外的受信任根运行。要知道,你并不能将它们添加到 System Roots 钥匙链中,因为它只能由操作系统更新。注意,只有第一组证书(提问中的“受信任证书”)会被复制,第二组证书和第三组证书则不会。出于安全考虑,作者不会提供一组现成的证书供大家下载使用,以免夹带私货。
回复二。在 2009 年初带有 El Capitan (10.11.6) 的旧 iMac 上尝试了以下操作,一切都按预期工作。
- 从 http://x1.i.lencr.org/ 下载 ISRG 根 X1 证书文件;
- 打开“钥匙串访问”应用,然后将该文件拖到该应用的“系统”文件夹中;
- 在系统中找到 ISRG 根 X1 证书并双击它,打开“信任”菜单并将“使用系统默认值”更改为“始终信任”,然后关闭该证书并输入密码以确认更改(如果出现提示)。
回复三。给出的答案对控制台应用程序都没有帮助。我相信大多数需求都是基于 curl 的,可以做如下操作。
- 备份
/etc/ssl/cert.pem
文件; - 用编辑器打开
/etc/ssl/cert.pem
; - 搜索
DST Root CA X3
。如果发现此(已过期的)根证书 —— 它就是问题的根源; - 删除此证书所有的 42 行。始于
### Digital Signature Trust Co.
终于-----END CERTIFICATE-----
; - 再使用
curl --cert-status https://example.com
命令检查是否正常。
此方法因何有帮助:由兼容性考虑,LE 证书有两条路可抵达根证书。出于某种原因(兼容性?),带有“DST 根 CA X3”证书的验证路径是首选路径。而且,据我了解,curl 更喜欢自己的根证书集(而不是系统证书),这些证书位于 /etc/ssl/cert.pem
。因此,删除过时的根证书会强制 curl 使用“ISRG Root X1”(当然,如果它已存在)。不过,如果你在一个非常旧的系统上执行此操作,则可能需要再执行一个步骤 —— 将此根证书添加到此文件(译者注:此处未完全理解)。只是要小心,应从可信赖的来源获取它。