如何在Python中使用SSL和身份验证连接到SOAP服务(没有WSDL)?

时间:2015-07-10 13:59:55

标签: python web-services ssl soap wsdl

我想连接到Python中没有WSDL的SOAP API。要连接,我需要添加SSL证书并在之后进行身份验证。

from pysimplesoap.client import SoapClient, SimpleXMLElement

cacert = open(path, 'rb').read()  # read the certificate
header = SimpleXMLElement('<Header/>')
credentials = header.add_child('Credentials')
credentials.marshall('Password', 'password')
credentials.marshall('Username', 'username')

client = SoapClient(
    location="https://mytest.com/Services/",
    cacert=cacert)
client['Header'] = header

client.action = "https://mytest.com/Services/Action1"

client.Action1()  # gives SSL error

我收到的结果是SSL错误:

SSLHandshakeError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

有人可以告诉我如何解决这个问题吗?或者您可以建议我可以使用的任何其他库。我发现的大多数SOAP库只提供与WSDL的连接。

1 个答案:

答案 0 :(得分:0)

通常在pfx文件中,客户端证书带有密钥,而不是CA文件。图书馆似乎期望客户证书为PEM。您应该提取https://stackoverflow.com/a/9516936/3929826中显示的证书和密钥。

然后将其作为SoapClient()cert参数传递到key_file首页:

client = SoapClient(location="https://mytest.com/Services/",
                    cert='mycert.pem',
                    key_file='mycert.key)

还应该可以将两者放入cert文件中。

如果仍然无效,则必须按照https://stackoverflow.com/a/7886248/3929826中的说明检索CA证书作为cacert参数。

有关详细信息,请参阅simplesoap的源代码:https://code.google.com/p/pysimplesoap/source/browse/pysimplesoap/client.py#75