关于python:SSLError(“坏握手”)在尝试访问资源时自定义证书和请求

SSLError(“bad handshake”) when trying to access resources Custom Certificates and Requests

我想用Zeep编程WebServices以在Python中交换数据。我只能用我的证书访问服务。我有一个pfx证书,但我把它转换成了两个.pem文件。

我的代码:

1
2
3
4
5
6
7
8
9
10
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')],)",),))


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

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

不要在生产中使用这个。

希望它有帮助!


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

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

  • 配置要在请求会话对象上使用的另一组证书。

举个例子:

1
2
3
4
import requests.sessions

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

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

1
r = photon_requests_session.get(url)