Python requests【unsafe legacy renegotiation disabled】问题

问题引出:

        用python的fastapi框架开发的api在本地window运行没有任何问题,但是部署到centor7上出现了SSLError(MaxRetryError(\"HTTPSConnectionPool(host='xxxx', port=443): Max retries exceeded with url: xxxxxx (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:997)')))\"))问题

解决方法:

        加上以下两句即可解决问题

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

<think>好的,我现在需要帮助用户解决Python requests库出现的SSLError问题,具体是访问https://ehall.seu.edu.cn时遇到的“unsafe legacy renegotiation disabled”错误。首先,我得理解这个错误的原因。根据用户提供的引用,特别是引用[1]、[3]和[4],这个错误通常与SSL/TLS协议的安全配置有关,可能因为服务器使用了旧的不安全的重协商机制,而客户端(如requests库使用的OpenSSL版本)禁用了这种不安全的旧协议。 接下来,我需要考虑可能的解决方案。根据常见的SSL错误处理,可能有以下几种方法: 1. **更新依赖库和OpenSSL版本**:检查用户的环境,特别是CentOS7上的OpenSSL版本。如果OpenSSL版本较新,可能默认禁用了不安全的旧协议,导致与服务器的兼容性问题。不过,用户提到在Windows本地运行正常,可能因为系统使用的OpenSSL版本不同。但升级可能不是最直接的解决办法,特别是生产环境中升级库可能存在风险。 2. **修改客户端SSL配置以允许旧协议**:引用[3]提到的Stack Overflow链接可能建议设置环境变量或调整SSL上下文,允许不安全的旧协议重协商。例如,设置`OPENSSL_CONF`环境变量指向一个允许不安全重协商的配置文件,或者在代码中创建自定义的SSL上下文,启用相关选项。 3. **忽略SSL验证(不推荐)**:临时解决方案是禁用SSL验证,但这会降低安全性,不适合生产环境。不过用户可能需要快速验证问题是否由SSL验证引起。 4. **使用其他库或工具**:比如使用curl命令测试,或者在Python中使用其他HTTP客户端库,看是否问题依旧,帮助确定问题根源。 现在需要具体分析每种方法的可行性。根据引用[1]中的错误信息,用户部署到CentOS7上出现的问题,而本地Windows正常,这可能与服务器环境的OpenSSL配置有关。CentOS7默认的OpenSSL版本可能较新,禁用了旧协议,而目标服务器可能仍在使用旧的重协商方式。因此,解决方法可能需要客户端调整SSL配置以兼容。 参考引用[3]中的文档,可能需要在代码中创建自定义的SSL上下文,设置选项允许不安全的重协商。例如,使用`ssl.OP_LEGACY_SERVER_CONNECT`选项,或者设置特定的密码套件。此外,可能还需要设置环境变量,如`export OPENSSL_CONF=/dev/null`,但这可能不太安全。 另一个可能性是使用`requests`库时传递`verify=False`参数来跳过证书验证,但这会引发警告,并且不安全。不过可以结合设置`CURL_CA_BUNDLE`环境变量为空,或者使用`session.verify = False`。 此外,用户可能需要更新`requests`和`urllib3`库到最新版本,确保兼容性。或者,尝试使用`pyOpenSSL`库作为替代的SSL后端,可能解决某些兼容性问题。 最后,可能需要联系服务器管理员,建议他们更新SSL/TLS配置,使用更安全的协议,避免依赖旧的重协商机制。但这可能不在用户控制范围内,所以客户端调整可能是必要的。 综合这些思路,我需要整理出步骤清晰、安全的解决方案,优先推荐调整SSL上下文的方法,并提醒用户注意安全风险。同时,提供替代方案供用户选择。</think>### Python requestsSSLError: unsafe legacy renegotiation disabled 解决方案 #### 问题原因 该错误是由于目标服务器(如$https://ehall.seu.edu.cn$)使用了旧版SSL/TLS协议的重协商机制,而客户端环境(如CentOS7的OpenSSL 3.0+)默认禁用了不安全的旧协议[^1][^3][^4]。 --- #### 解决方案 ##### 方法1:调整SSL上下文配置(推荐) 通过自定义SSL上下文启用兼容模式: ```python import requests import ssl from urllib3.util import ssl_ # 允许旧协议重协商 ssl_.DEFAULT_CIPHERS += ":ALL@SECLEVEL=1" session = requests.Session() session.mount("https://", TLSAdapter()) response = session.get("https://ehall.seu.edu.cn") ``` **原理**:降低安全等级(`SECLEVEL=1`)以允许旧协议[^3]。 --- ##### 方法2:设置环境变量(临时测试) 在终端中临时禁用安全限制: ```bash export OPENSSL_CONF=/dev/null # Linux/Mac python your_script.py ``` **注意**:此方法仅建议用于测试环境。 --- ##### 方法3:忽略证书验证(不推荐) 临时绕过SSL验证(仅用于调试): ```python import requests response = requests.get("https://ehall.seu.edu.cn", verify=False) ``` **风险**:会忽略证书有效性检查,可能导致中间人攻击[^2]。 --- ##### 方法4:更新依赖库 升级`requests`和`urllib3`: ```bash pip install --upgrade requests urllib3 ``` --- #### 验证步骤 1. 使用`curl`测试服务器兼容性: ```bash curl -v -k https://ehall.seu.edu.cn # -k忽略证书验证 ``` 2. 若`curl`成功但Python失败,说明是SSL库配置问题。 --- #### 附录:安全建议 建议联系服务器管理员升级TLS协议配置,避免依赖不安全的重协商机制。若必须长期使用兼容方案,需评估潜在安全风险。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Znovko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值