Python requests SSL错误UNSAFE_LEGACY_RENEGOTIATION_DISABLED排查
问题根因
不是IP被黑名单拦截。
报错的核心标识是ssl.SSLError: [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED],触发逻辑是:
nomads.ncep.noaa.gov站点的服务端未适配RFC 5746安全标准,仍使用存在已知漏洞的旧版TLS重协商机制- Ubuntu 22.04默认搭载的OpenSSL 3.0出于安全考虑,默认全局禁用了这种不安全的旧版重协商,因此TLS握手阶段直接被拦截
你更换Python侧的requests、urllib3、cryptography版本都无法解决问题,是因为这个安全限制是系统OpenSSL层的规则,和Python依赖包无关。其余HTTPS站点访问正常,是因为绝大多数公共站点早就完成了安全适配,不存在旧版重协商的问题。
解决方案
两种方案按需选择,优先推荐影响范围更小的方案1:
- 方案1:仅在当前Python请求逻辑中放开旧版重协商限制,不修改系统全局配置,无额外安全风险
实现代码如下:import requests import ssl class LegacySSLAdapter(requests.adapters.HTTPAdapter): def init_poolmanager(self, *args, **kwargs): ssl_context = ssl.create_default_context() ssl_context.options |= 0x4 # 开启SSL_OP_LEGACY_SERVER_CONNECT选项,允许旧版重协商 kwargs["ssl_context"] = ssl_context return super().init_poolmanager(*args, **kwargs) # 挂载自定义适配器发起请求 session = requests.Session() session.mount("https://", LegacySSLAdapter()) resp = session.get("https://nomads.ncep.noaa.gov/") print(resp.status_code) - 方案2:修改系统OpenSSL全局配置,放开旧版重协商限制(不推荐,会降低全系统所有SSL连接的安全等级)
打开系统OpenSSL配置文件:
在文件开头的sudo nano /etc/ssl/openssl.cnf[openssl_init]段落下添加如下配置:
保存退出后配置立即生效,原有的requests代码无需修改即可正常访问目标站点。ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] Options = UnsafeLegacyRenegotiation
内容的提问来源于stack exchange,提问作者marcos
相关产品推荐
相关产品推荐

