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

不好意思,看错了。你试试手动添加证书信息行不,在你调用 http.request 之前先 http.add_certificate
主要还是自己看文档吧 https://httplib2.readthedocs.io/en/latest/libhttplib2.html#http-objects

有一个高危操作,可以试试。
import ssl
# 表示忽略未经核实的 ssl 证书认证
ssl._create_default_https_context = ssl._create_unverified_context

遇到相同的问题,不过没报错就挂了

试了不好使

之前遇到过类似的问题,换了 py 版本莫名其妙的好了就没管他了

回到顶部