0. 背景
- 系统版本:MacOS 10.14.6
- openssl版本:LibreSSL 2.6.5
- 网站证书:Let’s Encrypt
1. 现象
自己的gitlab使用Let’s Encrypt生成的证书,在电脑上clone项目时提示: SSL certificate problem: certificate has expired
2. 排查
- 在safari和chrome中打开gitlab,查看到证书没有过期,并且根证书是“ISRG Root X1”签发的。
- 在终端中使用openssl进行测试
OpenSSL> s_client -connect {domain}:{port}
depth=1 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
verify return:0
depth=1 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
verify return:0
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
verify return:0
---
Certificate chain
0 s:/CN={domain}
i:/C=US/O=Let's Encrypt/CN=R3
1 s:/C=US/O=Let's Encrypt/CN=R3
i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
提示DST Root CA X3的根证书过期了
3. 尝试解决
- 先尝试在钥匙串中搜索这个证书,结果没有搜到。后来才发现,钥匙串默认隐藏了过期的证书,需手动显示他们(显示=>显示已过期的证书)
- 尝试不信任这个证书,结果发现也不起作用
- 用这三个关键词进行搜索:“10.14”、“git”、“dst root ca”
搜索到了这个issue[链接]
macOS 10.14 (Mojave) homebrew 更新失败(curl, git 链接的 LibreSSL 版本问题。需要在 /etc/ssl/cert.pem 中手动删除 DST 根证书)
- 看到这个解答后先尝试安装了最新的openssl进行测试,结果发现最新的openssl是没问题的
brew install openssl@1.1
/usr/local/opt/openssl@1.1/bin/openssl s_client -connect {domain}:{port}
- 确认和openssl版本相关后,又发现好像MacOS上更新openssl不太方便,就采取了3中,删除/etc/ssl/cert.pem DST根证书的方法
删除了以下内容
=== /O=Digital Signature Trust Co./CN=DST Root CA X3
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
44:af:b0:80:d6:a3:27:ba:89:30:39:86:2e:f8:40:6b
Signature Algorithm: sha1WithRSAEncryption
Validity
Not Before: Sep 30 21:12:19 2000 GMT
Not After : Sep 30 14:01:15 2021 GMT
Subject: O=Digital Signature Trust Co., CN=DST Root CA X3
.................
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
4. 为什么safari中显示的根证书和openssl中显示的不一样?
想起去年收到Let’s Encrypt发的邮件,说他们的某一个根证书要到期了[链接在这里],当时看说“对于大多数人来说,什么都不用做”,就没往心里去。 再看了一遍,又学习到了新姿势: 一个证书可被多个根证书信任,这种操作叫“交叉签名”。 低版本的openssl可能优先使用DST的证书,不去看ISRG。
|