踩坑:根证书过期

缘起

有人说:

职能团队不能说“不”(There is no “NO”.)。

意思是需求方提出的不管是什么需求,都要有解决方案。这不,公司由于业务需要,某些个团队有科学上网的需求(其实技术团队也有),提到运维这里了,我没法说搞不定呀,于是只能吭哧吭哧想办法解决,最早一版我自己用了好几年的方案被毙,理由是不要用,太复杂(其实也没有被毙,技术团队大多在用这个方案)。于是我就有整了个简单好用的方案,这几天正忙着方案落地呢。

在服务器上安装软件的时候,发现了这个问题。

问题详情

两台 Amazon Linux 2 的服务器,在我用 rpm 命令加 url 方式安装软件的时候,一台成功,一台出错。

仔细查,出错的那台是因为 https://download.libreswan.org/ 的证书过期。但为什么另外一台又没有问题呢?继续查:

1
2
3
openssl s_client \
-showcerts \
-connect download.libreswan.org:443

两台机器上分别执行上面的这个脚本,结果发现:

出错的那一台报(以下是部分输出):

depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT

好的那一台却报的是(以下是部分输出):

depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let’s Encrypt, CN = R3
verify return:1
depth=0 CN = libreswan.org
verify return:1

从看到的证书链上来看:

  • 证书 “CN=libreswan.org” 是“C=US/O=Let’s Encrypt/CN=R3” 签发的
  • 而 “C=US/O=Let’s Encrypt/CN=R3”是“C=US/O=Internet Security Research Group/CN=ISRG Root X1”签发的
  • “C=US/O=Internet Security Research Group/CN=ISRG Root X1”是“O=Digital Signature Trust Co./CN=DST Root CA X3”签发的

而过期的正是这个“DST Root CA X3”证书。

原因所在

最后发现两台机器的区别在哪里?在于软件包 ca-certificates 版本不一样,这个正是放系统自带信任的 CA 证书的软件包。其中报错的那台,ca-certificates 有“DST Root CA X3”这个证书;而不报错的那台 ca-certificates 里没有“DST Root CA X3”这个证书。

解决方案

问题解决也简单,报错的那台升级下 ca-certificates 即可:

1
yum -y update ca-certificates

思考

其实在两个不同版本的 ca-certificates 里,“ISRG Root X1”都在信任的根证书列表里面,为什么信任的根证书列表里有“DST Root CA X3”会出错呢?

附录

其实这些,AWS 官方早有文档说法,参见链接: