使用Python requests库访问URL时遇requests.exceptions.SSLError错误求助
解决Python requests访问越南商业银行API的SSL错误问题
问题原因
目标服务器启用了不安全的旧版SSL重协商协议,而Python 3.12的默认SSL配置为了安全,禁用了这种协商方式,导致连接失败。浏览器能正常访问是因为它默认兼容这类老服务器的配置。
解决方案
自定义SSL上下文,允许旧版重协商机制,再通过适配器挂载到requests会话中,具体代码如下:
import requests import ssl from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class LegacySSLAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): ctx = ssl.create_default_context() # 启用允许旧版SSL重协商的选项 ctx.options |= ssl.OP_LEGACY_SERVER_CONNECT kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) URL = "https://portal.vietcombank.com.vn/Usercontrols/TVPortal.TyGia/pXML.aspx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46" } # 创建会话并挂载自定义适配器 session = requests.Session() session.mount("https://", LegacySSLAdapter()) try: res = session.get(URL, timeout=10, headers=headers) res.raise_for_status() print(f"请求成功,状态码:{res.status_code}") # 如需查看返回的XML内容,取消注释下面一行 # print(res.text) except requests.exceptions.RequestException as e: print(f"请求失败:{str(e)}")
代码说明
- 自定义
LegacySSLAdapter适配器,重写连接池初始化方法,添加允许旧版重协商的SSL上下文配置。 - 使用
requests.Session挂载适配器,确保所有HTTPS请求都采用该自定义SSL配置。 - 加入异常处理,便于快速定位请求过程中的问题。
注意:该配置是为兼容旧服务器的临时方案,存在一定安全风险,若后续服务器更新SSL配置,建议移除该选项。
内容的提问来源于stack exchange,提问作者Doan Duc
相关产品推荐
相关产品推荐

