【发布时间】:2021-12-10 11:49:24
【问题描述】:
我的 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 的内容粘贴到其中。
不幸的是,错误仍然发生。谁能解释我做错了什么?
【问题讨论】:
-
还有一个问题。 session.cert = (r'path_to_my_cert.pem') 和 certifi 文件夹中的证书不同。 session.cert 是 API 所有者提供的证书。我没有注意这一点,但是在这样的代码中(将 session.cert 定义为外部)是使用这个外部证书而不是来自 certifi 的证书吗?