代码在urllib3 1.6版本正常运行,升级至2.0.4版本后报错如何修复?
问题
我有一段用于登录服务器的代码,在urllib3 1.6旧版本中可以正常运行,但在最新的2.0.4版本中无法正常工作。以下是处理SSL的代码:
import requests import urllib3 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
运行时出现的错误信息:
Traceback (most recent call last): File "c:\Users\xxx\xxx\Desktop\request\rqst_01.py", line 38, in <module> requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'urllib3.util.ssl_' has no attribute 'DEFAULT_CIPHERS'
解决方案
urllib3 2.0+ 彻底移除了DEFAULT_CIPHERS全局变量,无法再通过修改该属性调整SSL密码套件,需改用以下两种方式适配:
方式1:自定义SSL上下文(生产环境推荐)
创建自定义SSL上下文并指定密码套件,挂载到requests的Session中使用:
import requests from urllib3.util.ssl_ import create_urllib3_context # 禁用SSL警告 requests.packages.urllib3.disable_warnings() # 定义目标密码套件 TARGET_CIPHERS = 'DEFAULT:HIGH:!DH:!aNULL' # 创建urllib3上下文并设置密码套件 ssl_ctx = create_urllib3_context(ciphers=TARGET_CIPHERS) # 配置requests Session并挂载自定义适配器 session = requests.Session() adapter = requests.adapters.HTTPAdapter(ssl_context=ssl_ctx) session.mount('https://', adapter) # 使用session发起请求 response = session.get('https://你的服务器地址') print(response.status_code)
注:urllib3 2.x已默认弃用pyopenssl集成,无需再处理pyopenssl相关的密码套件配置。
方式2:环境变量临时配置(仅测试用)
通过环境变量指定密码套件,适合临时测试场景,不建议生产环境使用:
# Windows系统 set URLLIB3_CIPHERS=DEFAULT:HIGH:!DH:!aNULL # Linux/macOS系统 export URLLIB3_CIPHERS=DEFAULT:HIGH:!DH:!aNULL
设置完成后直接运行原有requests代码即可生效。
额外注意
urllib3 2.x默认采用系统标准SSL配置,安全性更高,仅当你的服务器明确需要旧版密码套件时才建议修改;若无需特定套件,可直接移除原代码中修改密码套件的逻辑,仅保留禁用警告的部分即可正常运行。
内容的提问来源于stack exchange,提问作者J.T
相关产品推荐
相关产品推荐

