Python如何解决ssl.SSLError:[SSL:CA_MD_TOO_WEAK]



我的API请求的授权遇到了一个巨大的问题。我使用的是python 3.10。为了设置客户端,我有如下代码:

from zeep import exceptions, helpers
from requests import Session
from zeep.transports import Transport
from zeep import Client
def login(register):
.......
elif register == 'XXX':
authTok = '' #only for coherence
wsdl_path = r"path_to_my_wsdl.wsdl"
url = urllib.parse.urljoin('file:', urllib.request.pathname2url(os.path.abspath(wsdl_path)))
session = Session()
session.verify = False
session.cert = (r'path_to_my_cert.pem')
client = Client(wsdl=url, transport=Transport(session=session))
return client, authTok

然后我使用下面的代码来获得客户端:

client, authTok = login('XXX')
search = {}
search['sort'] = {'sort_att': 'number',
'sort_asc': 'True'}
search['criterion'] = {'search_range': 'RP', 'id': '123456789'}

在此步骤之前没有错误。最后,我试着这样发送我的请求:r = client.service.searchcompany(params=search)

这里我得到了这样的错误:

ssl.SSLError: [SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3862)

使用openssl,我生成了新的证书:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out mycert.pem -sha256 -days 365 -nodes

作为输出,我收到了两个文件:key.pem和mycert.pem。使用命令certifi.where(),我找到了我的文件cacert.pem的位置,并将文件mycert.pem的内容粘贴到其中。

不幸的是,错误仍然存在。有人能解释一下我做错了什么吗?

在我的案例中,将python版本降级到3.8.8是很有帮助的。这解决了我的错误。

最新更新