python requests.exceptions.SSLError

本文介绍了在Python中遇到SSL连接问题,由于新版SSL库默认禁用弱DH算法导致的报错,提供了解决方案,包括引入代码调整ssl级别。

python调接口报错如下:

requests.exceptions.SSLError: HTTPSConnectionPool(host='abc.com', port=443)
Caused by SSLError(SSLError(1, '[SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1123)')))

简单分析了一下原因,最新版本的SSL默认不使用弱DH(DH:即Diffie-Hellman,密钥交换协议/算法),因此会报错。

这里的解决方案是通过设置默认值来降低ssl级别

在需要调度request的文件中引入用一下代码

import requests

requests.packages.urllib3.disable_warnings()
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
try:
    requests.packages.urllib3.contrib.pyopenssl.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
except AttributeError:
    # no pyopenssl support used / needed / available
    pass

在使用 Python 的 `requests` 库发起 HTTPS 请求时,如果遇到 `requests.exceptions.SSLError` 错误,通常是由于 SSL/TLS 握手失败导致的。此类问题可能与证书验证、服务器配置或客户端环境有关。以下是一些常见的排查与解决方法: ### 1. 禁用 SSL 验证(不推荐用于生产环境) 在某些测试环境中,可以临时禁用 SSL 证书验证以绕过错误,但这种方式会降低安全性。 ```python import requests response = requests.get('https://example.com', verify=False) ``` 此方法会触发 `InsecureRequestWarning` 警告,可以通过以下方式禁用警告: ```python from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) ``` ### 2. 指定信任的 CA 证书文件 如果服务器使用的是自签名证书或企业内部证书,可以通过 `verify` 参数指定信任的 CA 证书文件(PEM 格式)[^5]。 ```python response = requests.get('https://example.com', verify='/path/to/certfile.pem') ``` ### 3. 更新 CA 证书包 有时系统内置的 CA 证书可能已过期或不完整,可以尝试更新 `certifi` 包或手动更新系统证书。 ```bash pip install --upgrade certifi ``` 然后在代码中使用: ```python import certifi import requests response = requests.get('https://example.com', verify=certifi.where()) ``` ### 4. 检查服务器 SSL 配置 如果错误发生在连接特定服务器时(如监听在 443 端口的服务),可能是服务器端的 SSL 配置存在问题[^2]。可以使用在线工具如 [SSL Labs](https://www.ssllabs.com/ssltest/) 测试服务器 SSL 配置是否正确。 ### 5. 检查网络代理或中间设备 某些防火墙、代理或中间设备可能会拦截或篡改 HTTPS 流量,导致 SSL 握手失败。尝试更换网络环境或关闭代理设置进行测试。 ### 6. 使用自定义 SSL 上下文 如果需要更精细控制 SSL/TLS 版本或证书加载方式,可以使用 `urllib3` 的 `SSLContext` 功能: ```python import ssl import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class SSLAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): context = ssl.create_default_context() context.load_verify_locations(cafile="/path/to/certfile.pem") kwargs['ssl_context'] = context return super(SSLAdapter, self).init_poolmanager(*args, **kwargs) session = requests.Session() session.mount('https://', SSLAdapter()) response = session.get('https://example.com') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值