【问题标题】:Connection refused when using zeep SSL使用 zeep SSL 时连接被拒绝
【发布时间】:2017-07-23 13:13:17
【问题描述】:

我正在尝试使用 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 对象并将其称为名为@9​​87654325@ 的服务。

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”——zeep 是否使用它来调用它?然后我就会明白为什么会出现永久性错误。

有什么提示吗?

【问题讨论】:

  • 例如为什么HTTPSConnectionPool 中有“localhost”?这应该是服务器IP吧?
  • 这似乎是问题所在。如果我从本地机器到转发端口 80/443 的服务器建立一个 SSH 隧道,那么我可以访问 localhost:80 - 并使用它访问肥皂服务器 - 它可以完美运行。但这很奇怪 - SOAP 服务器有问题吗?

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


【解决方案1】:

要更改端点地址,我是这样使用的:

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

【讨论】:

    【解决方案2】:

    和往常一样,经过几天的搜索,在我在 Stackoverflow 上提问的那一刻,答案就通过其他渠道出现了。

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

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

    它就在那里:localhost。 Zeep(恕我直言)使用该服务端点与服务器进行通信。 我为测试做了什么:我通过 SSH 隧道将端口 80/443 连接到 localhost,所以 zeep 认为它与 localhost 通信。 沙赞,它奏效了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 2012-11-25
      • 2017-08-08
      • 2019-12-28
      • 2016-04-06
      • 2022-10-13
      • 2019-02-02
      • 1970-01-01
      相关资源
      最近更新 更多