使用zeep SSL时连接被拒绝

时间:2017-07-23 13:13:17

标签: python-3.x ssl soap urllib3 zeep

我正在尝试使用zeep访问SOAP服务器。我的服务器将SSL与自定义证书一起使用,并且与该服务器的连接可以使用我的证书,或者忽略它:

python -mzeep "https://<server-ip>/servicemanager/1?wsdl" --no-verify

我得到了一长串的前缀,全局元素,全局类型,绑定和服务。后者说:

Service: ServiceManager
     Port: servicemanager_1 (Soap11Binding: {http://soap.client.<snipped>.at}servicemanager_1Binding)
         Operations:
            getServices() -> return: ns0:service[]

所以,从我现在可以说的,我可以创建一个client对象,并将其称为getServices()的服务。

from zeep import CachingClient as Client
from zeep.wsse.signature import Signature
from zeep.transports import Transport
from requests import Session, Request

session = Session()
session.verify = False
transport = Transport(session=session)

c = Client('https://<server-ip>/servicemanager/1?wsdl', transport=transport)
c.service.getServices()

但这会导致urllib3错误(〜/ .virtualenvs / soap / lib / python3.5 / site-packages / urllib3 / util / connection.py ):

ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:
[...]
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='localhost',
port=443): Max retries exceeded with url: /servicemanager/1 (Caused by
NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object
at 0x7f4e2a6f7d30>: Failed to establish a new connection: [Errno 111]
Connection refused',))

如果忽略SSL验证或提供CA_BUNDLE,则无关紧要。两者都被接受,客户端已创建,但我无法调用getServices()方法。

我忘记了什么?我认为这不是一个问题,因为底层的urllib3抛出异常。但我试了好几个小时,在互联网上寻找解决方案,但没有成功。

我从端点获取的XML除了:

<service name="ServiceManager">
  <port name="servicemanager_1" binding="tns:servicemanager_1Binding">
    <soap:address location="http://localhost/servicemanager/1"/>
  </port>
</service>

而且我不知道为什么它会在那里返回一个“localhost” - 是否会使用它进行调用?然后我会理解为什么会发生永久性错误。

任何提示?

2 个答案:

答案 0 :(得分:1)

要更改端点地址,我会这样使用它:

client.service._binding_options['address'] = 'https://mynewaddress.com/service.wsdl'

答案 1 :(得分:0)

与往常一样,经过几天的搜索,在我向Stackoverflow询问的那一刻,答案是通过其他渠道得出的。

如果有人遇到同样的问题,这就是解决方案。我的服务器为我提供了WSDL文件,如上所述:

<service name="ServiceManager">
  <port name="servicemanager_1" binding="tns:servicemanager_1Binding">
    <soap:address location="http://localhost/servicemanager/1"/>
  </port>
</service>

它代表着:localhost。 Zeep(正确的恕我直言)使用该服务端点与服务器进行通信。 我做了什么测试:我将端口80/443通过SSH隧道连接到localhost,所以zeep认为它与localhost通信。 Shazaam,它有效。

所以我的服务器是罪魁祸首 - 太糟糕了,我无法改变它,因为我无法控制它。 但现在可以采取一种解决方法。

相关问题