首页 > 解决方案 > 如何使用指定的 ca 文件通过 ssl 执行 get 请求

问题描述

作为一项实验,我正在尝试使用指定的 ca 文件向https://google.com发出 GET 请求。

通过以下 openssl 命令检索 Google 的证书:

openssl s_client -showcerts -connect google.com:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

使用此证书,我使用以下代码发出 GET 请求:

cafile = "mycertfile.pem"
r = requests.get("https://google.com", verify=cafile)
print(r.status_code)

为什么这不起作用并导致 SSL 证书验证失败?

Traceback (most recent call last):
  File "C:/Users/jarno/Projects/pyplayground/main.py", line 6, in <module>
    r = requests.get("https://google.com", verify=cafile)
  File "C:\Users\jarno\Projects\flasktest\venv\lib\site-packages\requests\api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\jarno\Projects\flasktest\venv\lib\site-packages\requests\api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\jarno\Projects\flasktest\venv\lib\site-packages\requests\sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\jarno\Projects\flasktest\venv\lib\site-packages\requests\sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\jarno\Projects\flasktest\venv\lib\site-packages\requests\adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)')))

标签: pythonssl

解决方案


推荐阅读