Requests报”requests.exceptions.SSLError: {ssl error message} “的原因以及解决办法

  • Post category:Python

Requests报”requests.exceptions.SSLError: {ssl error message} “的原因

当你使用requests库发送HTTPS请求的时候,有可能会报出以下的错误:

requests.exceptions.SSLError: {ssl error message}

其中{ssl error message}可以是不同的内容,例如[SSL: CERTIFICATE_VERIFY_FAILED][SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed等。

这种错误的主要原因是因为根证书无法验证或者服务器证书问题导致的。

在 Python 2.x 版本中,如果我们使用 requests 库发送 HTTPS 请求,它将由内置 ‘urllib3′ 库处理 HTTPS 请求。’urllib3’ 库使用 httplib 库发送 HTTPS 请求。

当 Python 2.x 的 ‘urllib3’ 库处理 HTTPS 请求时,将使用如下代码来验证 SSL 证书:

import certifi
ca_certs = certifi.where()
...
    ssl_context.load_verify_locations(ca_certs)
...

这个代码会从本系统的证书存储中读取包含根证书的文件,并将其添加到 SSL 上下文对象中,用于验证服务器证书的合法性。

如果在这个操作中出现错误,将会报出类似上述的 requests.exceptions.SSLError 错误。

解决办法的完整攻略

以下是一些可能的解决方案:

1. 确认请求地址是否正确

首先,需要确认我们制定的请求地址是否正确。

确保该地址是具备 SSL 证书的 HTTPS 协议的地址,分享地址有没有写错等等。

例如,如果我们请求的 URL 是 https://example.com,请检查将 httphttps 和端口号是否正确指定。

2. 尝试升级Python版本

如果您正在使用 Python 2.x 版本,则可能会出现错误。您可以尝试使用 Python 3.x 版本来看看是否能够解决此问题。

3. 禁用 SSL 验证

这个方法不建议用于生产环境中,但可能是解决问题的一种简单而有效的方法。

可以在requests.get()post()方法中传入verify=False来关闭 SSL 验证。

示例:

url = 'https://example.com'
response = requests.get(url, verify=False)

4. 确认证书地址是否正确

如果您的系统证书文件没有在正确的位置,您可以使用 certifi 模块中的 where() 方法获取证书文件路径。

import certifi
certifi.where()  # 返回证书路径

确保证书在正确的路径上,并且证书文件名正确。

如果您的证书文件名不是默认情况下的“cacert.pem”,则必须手动加载证书文件:

import requests
import os

cafile = os.path.abspath('/path/to/certificate.crt')
response = requests.get('https://example.com', verify=cafile)

5. 更新根证书

如果您的系统证书文件存在问题,你可以尝试手动更新根证书。

每个操作系统都提供了一个标准的证书存储位置,以便管理根证书的安装。

请参阅 Opera Software 的网页以了解如何更新根证书:

6. 更新库

安装最新版本的 requests 库,并更新您的 Python 环境。

执行以下命令更新 requests 库:

pip install requests --upgrade

7. 概览应用程序实现

如果以上方法都不能解决问题,可能需要重新概览您的应用程序。

可以稍微调整一下 SSL 验证的参数,看看它是否可以解决问题。

也可以查看您访问的网站是否有其他安全措施导致请求失败。

根据所使用的平台或其他因素进行修改或配置,也要考虑这种情况。

以下是一些可能的 SSL 配置选项:

response = requests.get(url, verify=True, cert='/path/to/certfile', headers=headers)

希望这个攻略能够解决您的问题。