Python: SSL证书验证大多数网站失败



最近,我不得不在Windows 10笔记本电脑上卸载2018年的旧版本Anaconda (Anaconda3-5.2.0-Windows-x86_64.exe, Python 3.6.3),因为我无法在其上安装新版本的Python和一些软件包。我测试了3个不同的Anaconda版本(2021.11、2021.04和2020.07),默认安装了不同版本的Python 3.8和3.9,从那以后遇到了一些问题:

  • 当启动Jupyter Notebook时,默认情况下只能发现基本环境。除非手动添加,否则不会发现其他conda环境。以前不是这样的。
  • 当使用urllib或请求从网站访问数据时,几乎每个与我旧的Anaconda/Python配置一起工作的网站现在都返回SSL证书验证失败错误。它适用于少数网站(例如,谷歌),但对绝大多数网站(例如,维基百科,Stack Overflow)失败。

错误信息如下:

>>> import urllib.request as urllib
>>> urllib.urlopen("https://en.wikipedia.org/wiki/Main_Page")
Traceback (most recent call last):
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 1348, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 1037, in _send_output
self.send(msg)
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 975, in send
self.connect()
File "C:UsersTomerAnaconda3envsmainlibhttpclient.py", line 1454, in connect
self.sock = self._context.wrap_socket(self.sock,
File "C:UsersTomerAnaconda3envsmainlibssl.py", line 512, in wrap_socket
return self.sslsocket_class._create(
File "C:UsersTomerAnaconda3envsmainlibssl.py", line 1070, in _create
self.do_handshake()
File "C:UsersTomerAnaconda3envsmainlibssl.py", line 1341, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:997)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 519, in open
response = self._open(req, data)
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 536, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 496, in _call_chain
result = func(*args)
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 1391, in https_open
return self.do_open(http.client.HTTPSConnection, req,
File "C:UsersTomerAnaconda3envsmainliburllibrequest.py", line 1351, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:997)>

我试图通过以下方式来复制事情停止工作的地方:(1)重新创建我的旧Anaconda3环境,我可以通过urllib访问url,(2)运行'conda install certificate ',这迫使许多其他软件包更新,并带来SSL证书验证错误。以下是对几个包的不同之处的比较:

#       Name                      Version                   Build  Channel
Works:  openssl                   1.0.2o               h8ea7d77_0  
Broken: openssl                   3.0.3                h8ffe710_0    conda-forge
Works:  ca-certificates           2018.03.07                    0  
Broken: ca-certificates           2021.10.8            h5b45459_0    conda-forge
Works:  certifi                   2018.4.16                py36_0  
Broken: certifi                   2021.10.8       py310h5588dad_2    conda-forge

我以前从未遇到过这样的错误,所以我不确定这些是主要负责的包,还是其他一些更新的包(例如,pypi, python 3.10或3.9)可能导致这个错误开始发生,或者如果它可能是我的计算机端超出Anaconda的错误。

任何提示或帮助试图解决这个问题将非常感激!

编辑:我已经完全删除了Anaconda,并在Python 3.9.10上安装了Miniforge3 (Miniforge3-4.12.0-0- windows -x86_64.exe) -同样的问题也在那里复制,所以它并不仅限于Anaconda。我也可以直接在浏览器上访问这些网站,所以我怀疑这可能与我的计算机无关,而是与Python有关。

你能用Firefox检查吗?Firefox使用自己的证书。如果有效,则意味着您需要更新证书颁发机构。

相关内容

最新更新