【问题标题】:Python-How to solve ssl.SSLError: [SSL: CA_MD_TOO_WEAK]Python-如何解决 ssl.SSLError: [SSL: CA_MD_TOO_WEAK]
【发布时间】: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 的证书吗?

标签: python api ssl zeep


【解决方案1】:

在我的情况下,将 python 的版本降级到 3.8.8 很有帮助。这解决了我的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2019-05-10
    • 2020-01-14
    • 1970-01-01
    • 2017-06-25
    相关资源
    最近更新 更多