18

我想使用 Zeep 对 Web 服务进行编程以在 Python 中交换数据。我只能使用我的证书访问服务。我有 PFX 证书,但我将其转换为两个.pem文件。

我的代码:

from zeep import Client
from zeep.wsse.signature import Signature 
import requests
from requests import Session
key_filename ='/.files/cert.key.pem'
cert_filename = './files/cert.crt.pem'
session = Session()  
r = requests.get('https:...../PingWs?wsdl',
             cert=(cert_filename, key_filename)) 
print (r)

但我明白了

> raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='evidim-test.gov.si', port=443):
Max retries exceeded with url: /ws/test/PingWs?wsdl
(Caused by SSLError(SSLError("bad handshake: Error([('SSL routines',
'tls_process_server_certificate', 'certificate verify failed')],)",),))
4

2 回答 2

37

您必须通过将用于签署您尝试从系统设置连接到的远程服务器证书的 CA 证书列入白名单来解决这个问题。但仅出于测试目的,您可以使用以下方法关闭验证:

r = requests.get('https:...../PingWs?wsdl',verify=False)

不要在生产中使用它。

希望能帮助到你!

于 2017-12-02T01:33:03.407 回答
5

此错误几乎可以肯定意味着远程端点未使用本地证书颁发机构存储中的证书进行签名。你有两个选择:

  • 在请求使用的 CA 存储中安装证书。默认情况下,这是您的本地系统 CA 存储,至少可以由请求确定。

  • 配置一组不同的证书以用于请求会话对象。

举个例子:

import requests.sessions

photon_requests_session = requests.sessions.Session()
photon_requests_session.verify = "/etc/photon/cacerts.pem"

然后我需要确保服务器 CA 证书在 /etc/photon/cacerts.pem 中。我这样使用:

r = photon_requests_session.get(url)
于 2017-12-02T01:47:00.720 回答