前言
开发环境使用WSL Ubuntu系统,由于开发需要,apt安装软件包时出现。
Failed to fetch https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/universe/p/poco/libpocodataodbc62_1.9.2-3ubuntu3_amd64.deb Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate. Could not handshake: Error in the certificate verification.
打开清华源的网站,发现证书一切正常。同时看见,证书已经在2021年9月26日续期了。
问题来了,查询到let's encrypt网站发现10月1日出现了这么一条:Resources for Certificate Chaining Help,意思是根证书要到期了,还使用了这个词:big change。
那么问题来了,根证书过期为何会有巨大的影响?
根证书
根证书存放在系统下,由系统进行管理。如果根证书未及时的进行更新,就会出现证书过期的情况导致信任链被破坏,无法访问HTTPS的情况。
linux的ca-certificates包内包含一系列信任的根证书(firefox)。具体可以参考CA Certificates In Firefox(信任根证书列表),CA-Certificates(ca-certificates包介绍)。
CA证书
一个网站使用的证书,是经过CA进行私钥签名的。你需要使用CA公钥对网站证书进行解密,才能使用该网站证书通信。(当然,CA证书也要通过颁发CA证书的根证书来验证)
CA公钥是存放在哪里呢?
-- 你的浏览器里。
这一过程,涉及到了证书信任链的问题。
信任链
类似TPM的信任链
根证书->CA证书->颁发的网站证书
这就是为什么你想要安装HTTPS的广告过滤器还要安装根证书的原因。
广告过滤器充当MITM角色,在用户和网站之间把广告过滤了,然后在发给用户。用户看到的HTTPS证书颁发者都是由你信任的广告过滤器的根证书颁发,因此形成了一个信任链,不会报错HTTPS不可信。
解决方法
根据网络上的解决方法,发现更新ca-certificates不可行。
有一下三个方法。
- 选择将apt源回退为http
- 选择非let's encrypt证书的服务器解决。
- 执行
sudo update-ca-certificates
更新证书(存疑)
后记
let's encrypt根证书过期的问题,较大程度的影响了linux的服务器,实际对Windows的影响不大(Windows的证书更新较为透明?)。