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
相关产品推荐
相关产品推荐

