使用Python调用SIDRA(IBGE) API时遇SSLError问题求助
解决SSL UNSAFE_LEGACY_RENEGOTIATION_DISABLED错误
这个错误的核心原因是目标服务器使用了不安全的SSL重新协商机制,而你的本地OpenSSL版本默认禁用了该机制,导致SSL握手失败。以下是经过验证的解决方法:
方法1:自定义SSL适配器(适配requests库)
创建一个允许旧协商逻辑的SSL适配器,替换requests默认的适配器:
import requests import ssl from urllib3.poolmanager import PoolManager class LegacySSLAdapter(requests.adapters.HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): # 创建SSL上下文并启用旧服务器连接选项 ctx = ssl.create_default_context() ctx.options |= 0x4 # OP_LEGACY_SERVER_CONNECT,允许旧协商逻辑 self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_context=ctx ) url = 'https://servicodados.ibge.gov.br/api/v3/agregados' # 创建会话并挂载自定义适配器 session = requests.Session() session.mount('https://', LegacySSLAdapter()) response = session.get(url) print(response.json())
方法2:临时通过环境变量绕过限制
在运行脚本前设置环境变量,临时让OpenSSL允许不安全的旧协商:
Linux/macOS终端:
export OPENSSL_CONF=/dev/null
然后执行你的Python脚本。
Windows命令提示符:
set OPENSSL_CONF=NUL
再执行脚本。
方法3:修改OpenSSL全局配置(不推荐,影响所有应用)
找到本地OpenSSL的配置文件(通常名为openssl.cnf或openssl.conf),添加或修改以下配置段:
[system_default_sect] MinProtocol = TLSv1.2 CipherString = DEFAULT:@SECLEVEL=1 Options = UnsafeLegacyRenegotiation
保存后重启Python环境即可生效。
内容的提问来源于stack exchange,提问作者João Lucio
相关产品推荐
相关产品推荐

