首页 > 解决方案 > Python 3.8.3 - requests.get 失败,SSL 证书验证失败,尽管 urllib.request.urlopen 有效

问题描述

我在 Windows 10 机器上安装了新的(2020 年 5 月)python 3.8.3。

当我尝试使用 requests.get 读取 https url 时,它会因 SSL 错误“证书验证失败”而失败。但是当我尝试使用 urllib.request.urlopen 读取相同的 url 时,它工作正常。将此作为一个新问题提出,因为如果证书/权限/等。是一个问题 urllib.requests 也应该失败。

我尝试了针对Python Requests throwing SSL Error问题给出的建议,但没有任何成功。将不胜感激任何帮助。

urllib.request.urlopen 有效:

>>> import ssl
>>> import urllib.request
>>> ssl_context = ssl.create_default_context()
>>> r = urllib.request.urlopen('https://google.com', context = ssl_context).getcode()
>>> r
200

Requests.get 失败:

>>> import requests
>>> r = requests.get('https://google.com')
Traceback (most recent call last):
  File "C:\Program Files\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
    httplib_response = self._make_request(
  File "C:\Program Files\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 381, in _make_request
    self._validate_conn(conn)
  File "C:\Program Files\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 976, in _validate_conn
    conn.connect()
  File "C:\Program Files\Python\Python38\lib\site-packages\urllib3\connection.py", line 361, in connect
    self.sock = ssl_wrap_socket(
  File "C:\Program Files\Python\Python38\lib\site-packages\urllib3\util\ssl_.py", line 377, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "C:\Program Files\Python\Python38\lib\ssl.py", line 500, in wrap_socket
    return self.sslsocket_class._create(
  File "C:\Program Files\Python\Python38\lib\ssl.py", line 1040, in _create
    self.do_handshake()
  File "C:\Program Files\Python\Python38\lib\ssl.py", line 1309, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)

标签: python-3.xsslpython-requestsurllib

解决方案


推荐阅读