Skip to the content.

SSL证书验证失败问题的解决

问题描述

我在使用Python的requests库进行HTTP请求时,遇到了如下错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='example.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)'),))

我已经确认过目标网站的SSL证书是可信的,并且在其他机器上也可以正常访问该网站。因此,我认为这个问题并不是由目标网站的证书问题导致的,而是由其他原因造成的。

解决过程

第一步:尝试更新CA证书

由于该错误与证书验证有关,我首先尝试更新系统中的CA证书。我使用以下命令安装了最新的CA证书:

sudo apt-get install ca-certificates

但是,这并没有解决问题。错误仍然存在。

第二步:检查系统时间

接着,我开始怀疑操作系统的时间可能不正确。因为证书的验证过程中会使用到本地系统的时间,如果系统时间不正确,就会导致证书验证失败。因此,我使用以下命令检查了当前系统时间:

date

发现系统时间比实际时间早了一个月。于是,我使用以下命令将系统时间修改为当前时间:

sudo date -s "2023-03-22 10:00:00"

修改后,再次执行请求,问题解决了!

根本原因

通过排查,我发现这个问题的根本原因是操作系统的时间不正确导致的证书问题。由于证书验证过程中使用了本地系统的时间,如果系统时间不正确,就会导致证书验证失败。

解决方案

如果遇到类似的SSL证书验证失败问题,首先可以尝试更新系统中的CA证书。如果更新CA证书无效,可以检查系统时间是否正确。如果系统时间不正确,需要及时进行修改。可以使用以下命令修改系统时间:

sudo date -s "yyyy-MM-dd HH:mm:ss"

注意,系统时间的不正确可能导致多种问题,不仅仅是SSL证书验证问题。因此,在遇到类似的问题时,应该首先检查系统时间是否正确。

结论

通过对这个问题的排查和解决,我发现SSL证书验证失败问题的根本原因是操作系统的时间不正确导致的证书问题。解决方案是更新CA证书或修改系统时间。在遇到类似的问题时,应该先尝试更新CA证书,如果更新无效,再检查系统时间是否正确。本文的解决方案是使用ChatGPT得出的。