You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Requests包调用GitHub API时遇SSL证书验证失败问题求助

SSL证书验证失败问题解决(针对Requests调用GitHub API)

问题描述

我在PyCharm中使用Python 3.12开发,已通过pip安装Requests v2.31,执行以下代码时遭遇SSL证书验证失败错误:

import requests
r = requests.get('https://api.github.com/events')

错误栈如下:

Traceback (most recent call last):
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connectionpool.py", line 467, in _make_request
    self._validate_conn(conn)
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connectionpool.py", line 1096, in _validate_conn
    conn.connect()
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connection.py", line 642, in connect
    sock_and_verified = _ssl_wrap_socket_and_match_hostname(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connection.py", line 782, in _ssl_wrap_socket_and_match_hostname
    ssl_sock = ssl_wrap_socket(
               ^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\util\ssl_.py", line 470, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\util\ssl_.py", line 514, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\AppData\Local\Programs\Python\Python312\Lib\ssl.py", line 455, in wrap_socket
    return self.sslsocket_class._create(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\AppData\Local\Programs\Python\Python312\Lib\ssl.py", line 1046, in _create
    self.do_handshake()
  File "C:\Users\mfischer\AppData\Local\Programs\Python\Python312\Lib\ssl.py", line 1317, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connectionpool.py", line 790, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connectionpool.py", line 491, in _make_request
    raise new_e
urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\connectionpool.py", line 844, in urlopen
    retries = retries.increment(
              ^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\urllib3\util\retry.py", line 515, in increment
    raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: /events (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\mfischer\PycharmProjects\NewProject\main.py", line 2, in <module>
    r = requests.get('https://api.github.com/events')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mfischer\PycharmProjects\NewProject\venv\Lib\site-packages\requests\adapters.py", line 517, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: /events (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))

Process finished with exit code 1

解决方案

1. 临时绕过SSL验证(仅测试环境使用)

如果仅用于测试,可以在请求中添加verify=False参数跳过证书验证:

import requests
r = requests.get('https://api.github.com/events', verify=False)

⚠️ 注意:此方法关闭SSL安全验证,禁止在生产环境使用,存在中间人攻击风险。

2. 配置信任根证书

错误核心是Python环境无法识别系统根证书,可手动指定证书路径:

  • 找到系统根证书文件(Windows下通常为C:\Windows\System32\certificates\root\ca-bundle.crt,或从浏览器导出GitHub的证书链)
  • 在请求中指定证书路径:
import requests
r = requests.get('https://api.github.com/events', verify='path/to/your/ca-bundle.crt')

也可设置环境变量REQUESTS_CA_BUNDLE指向证书文件,让所有Requests请求自动使用该证书。

3. 更新certifi库

Requests依赖certifi库提供根证书列表,更新该库可获取最新信任证书:
在PyCharm终端执行:

pip install --upgrade certifi

更新后,Requests会自动使用certifi提供的最新根证书,通常能解决多数证书验证问题。

4. 检查代理设置

若处于公司/学校网络,可能是代理服务器证书未被信任。可配置代理并指定代理证书:

import requests
proxies = {
    'http': 'http://your-proxy:port',
    'https': 'https://your-proxy:port',
}
r = requests.get('https://api.github.com/events', proxies=proxies, verify='path/to/proxy-cert.crt')

或联系网络管理员获取合法代理证书并添加到系统信任列表。

内容的提问来源于stack exchange,提问作者walleye2416

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:44:55