You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

urllib3 2.0.0+版本下如何为Python Requests设置默认加密套件?

解决urllib3 2.0+下Requests的DH密钥过小SSL错误(不降级)

当urllib3升级到2.0.0及以上版本后,requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS被移除,无法再通过修改全局默认加密套件解决SSL_NEGATIVE_LENGTH(DH密钥过小)错误。以下是两种无需降级urllib3的解决方案:

方案一:自定义PoolManager注入SSLContext

通过继承urllib3的PoolManager,自定义SSLContext并传入,再挂载到Requests的Session中:

import requests
import ssl
from urllib3.poolmanager import PoolManager

class CustomSSLManager(PoolManager):
    def __init__(self, *args, **kwargs):
        # 创建默认SSL上下文
        ssl_ctx = ssl.create_default_context()
        # 设置加密套件及安全等级,解决DH密钥过小问题
        ssl_ctx.set_ciphers('ALL:@SECLEVEL=1')
        # 可选:如果需要兼容更旧的SSL协议(不推荐,仅用于极端场景)
        # ssl_ctx.options &= ~ssl.OP_NO_SSLv3
        # ssl_ctx.options &= ~ssl.OP_NO_TLSv1_0
        
        kwargs['ssl_context'] = ssl_ctx
        super().__init__(*args, **kwargs)

# 给Session挂载自定义的PoolManager
session = requests.Session()
session.mount('https://', CustomSSLManager())

# 测试请求
try:
    resp = session.get('https://你的目标域名.com')
    print(f"请求成功,状态码:{resp.status_code}")
except requests.exceptions.SSLError as e:
    print(f"SSL错误:{e}")

方案二:通过Requests Adapter配置SSLContext

使用Requests的HTTPAdapter扩展,在初始化PoolManager时注入自定义SSLContext:

import requests
import ssl
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager

class SSLContextAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        ssl_ctx = ssl.create_default_context()
        ssl_ctx.set_ciphers('ALL:@SECLEVEL=1')
        # 初始化带自定义SSL上下文的PoolManager
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_context=ssl_ctx
        )

# 绑定Adapter到Session
session = requests.Session()
session.mount('https://', SSLContextAdapter())

# 发送请求
resp = session.get('https://你的目标域名.com')

注意事项

  • @SECLEVEL=1会降低SSL安全等级,仅建议在访问无法升级DH密钥的老旧服务时使用,优先推动服务端将DH密钥升级到2048位以上。
  • 可以替换ALL:@SECLEVEL=1为更具体的加密套件列表,比如ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384,但@SECLEVEL=1是解决DH密钥过小最直接的方式。
  • 两种方案都是基于Session级别的配置,只会影响该Session的请求,不会全局修改其他Requests请求的SSL配置。

内容的提问来源于stack exchange,提问作者Azza Worsley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:22:12