使用Zeep时遇SSL错误:如何修改密码套件?
解决Zeep加载WSDL时的DH_KEY_TOO_SMALL SSL错误
要解决老旧服务器引发的这个SSL密钥问题,核心是给Zeep配置自定义的requests Session,在Session里调整SSL参数,具体实现如下:
方法一:指定兼容的密码套件
创建自定义SSL上下文,适配老旧服务器的安全级别,再挂载到requests Session中传给Zeep Client:
import requests from zeep import Client from zeep.transports import Transport import ssl from requests.adapters import HTTPAdapter # 创建SSL上下文,降低安全级别适配老旧服务器 ctx = ssl.create_default_context() ctx.set_ciphers('DEFAULT:@SECLEVEL=1') # 配置自定义Session并挂载SSL设置 session = requests.Session() adapter = HTTPAdapter(ssl_context=ctx) session.mount('https://', adapter) # 将配置好的Session传给Zeep,初始化Client transport = Transport(session=session) client = Client('https://api-mte.itespp.org/markets/VirtualService/v2/?WSDL', transport=transport)
方法二:禁用高版本SSL协议(可选)
如果方法一仍报错,可以尝试禁用服务器不支持的高版本SSL协议(注意这会降低安全性,仅必要时使用):
import requests from zeep import Client from zeep.transports import Transport import ssl from requests.adapters import HTTPAdapter ctx = ssl.create_default_context() ctx.set_ciphers('DEFAULT:@SECLEVEL=1') # 禁用服务器不支持的TLS版本,按需调整 ctx.options |= ssl.OP_NO_TLSv1_3 ctx.options |= ssl.OP_NO_TLSv1_2 session = requests.Session() adapter = HTTPAdapter(ssl_context=ctx) session.mount('https://', adapter) transport = Transport(session=session) client = Client('https://api-mte.itespp.org/markets/VirtualService/v2/?WSDL', transport=transport)
原理说明
Zeep底层依赖requests库处理HTTP请求,只要给Zeep传入配置好SSL参数的自定义Session,就能让Zeep使用兼容老旧服务器的SSL设置,和单独用requests解决该错误的逻辑完全一致。
内容的提问来源于stack exchange,提问作者geckels1
相关产品推荐
相关产品推荐

