Python中解决win环境下python3 ssl certificate verify failed错误
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\googleapiclient\http.py", line 164, in _retry_request
resp, content = http.request(uri, method, *args, **kwargs)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\oauth2client\transport.py", line 175, in new_request
redirections, connection_type)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\oauth2client\transport.py", line 282, in request
connection_type=connection_type)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\httplib2\__init__.py", line 1926, in request
cachekey,
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\httplib2\__init__.py", line 1595, in _request
conn, request_uri, method, body, headers
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\httplib2\__init__.py", line 1501, in _conn_request
conn.connect()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\httplib2\__init__.py", line 1291, in connect
self.sock = self._context.wrap_socket(sock, server_hostname=self.host)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\ssl.py", line 407, in wrap_socket
_context=self, _session=session)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\ssl.py", line 814, in __init__
self.do_handshake()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\ssl.py", line 1068, in do_handshake
self._sslobj.do_handshake()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\ssl.py", line 689, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
在 mac 下运行没问题,在 Linux 服务器上也 ok
在 win 跑就上面错误,是缺了什么包?
Python中解决win环境下python3 ssl certificate verify failed错误
11 回复
根据报错只能推测,有没有开抓包软件导致证书错误?(关键还是把自己程序部分的报错信息发出来,目前能看到的都是回溯到库的报错。)
这个问题通常是因为Python在Windows上找不到合适的SSL证书文件。Windows没有标准的证书存储位置,所以Python的ssl模块可能无法验证HTTPS连接。
最简单的解决方案是使用certifi包,它提供了Mozilla的CA证书包。安装后,让Python使用它的证书文件:
import ssl
import certifi
# 设置全局的SSL证书路径
ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where())
或者更简洁的方式,在代码开头设置环境变量:
import os
import certifi
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where()
os.environ['SSL_CERT_FILE'] = certifi.where()
如果你用requests库,可以直接在会话中指定:
import requests
import certifi
session = requests.Session()
session.verify = certifi.where()
response = session.get('https://example.com')
对于urllib:
import urllib.request
import certifi
opener = urllib.request.build_opener()
opener.add_handler(urllib.request.HTTPSHandler(context=ssl.create_default_context(cafile=certifi.where())))
urllib.request.install_opener(opener)
先运行pip install certifi安装包,然后在代码最开始的地方加上这些设置就行。
总结:用certifi包提供证书文件最省事。
代码看上面,是 googleapiclient 包执行的
试试在 requests.get()里添加关键字参数 verify=False
估计 win 上的环境有某种‘中间人’。
PS. 别听楼上的。
用的不是 requests
是 httplib2
有一个高危操作,可以试试。
import ssl
# 表示忽略未经核实的 ssl 证书认证
ssl._create_default_https_context = ssl._create_unverified_context
遇到相同的问题,不过没报错就挂了
试了不好使
之前遇到过类似的问题,换了 py 版本莫名其妙的好了就没管他了


