首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用zeep SSL时拒绝连接

使用zeep SSL时拒绝连接
EN

Stack Overflow用户
提问于 2017-07-23 13:13:17
回答 2查看 5.7K关注 0票数 2

我正在尝试使用泽普访问SOAP服务器。我的服务器使用带有自定义证书的SSL,与该服务器的连接与我的证书一起工作,或者忽略它:

代码语言:javascript
复制
python -mzeep "https://<server-ip>/servicemanager/1?wsdl" --no-verify

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

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

因此,根据我现在可以说的,我可以创建一个client对象,并调用它的服务名为getServices()

代码语言:javascript
复制
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()

但这导致了(~/.virtualenvs/soap/lib/python3.5/site-packages/urllib3/util/connection.py):urllib3中的一个错误。

代码语言:javascript
复制
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()方法。

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

除了我从端点获得的XML之外,还有:

代码语言:javascript
复制
<service name="ServiceManager">
  <port name="servicemanager_1" binding="tns:servicemanager_1Binding">
    <soap:address location="http://localhost/servicemanager/1"/>
  </port>
</service>

我不知道为什么它会返回一个“本地主机”-- zeep是在用它来调用它吗?那么我就能理解为什么会出现永久性的错误。

有什么暗示吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-07 20:40:40

要更改端点地址,我采用如下方式:

代码语言:javascript
复制
client.service._binding_options['address'] = 'https://mynewaddress.com/service.wsdl'
票数 2
EN

Stack Overflow用户

发布于 2017-07-24 07:26:43

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

如果有人有同样的问题,下面是解决办法。我的服务器为我提供了WSDL文件,如上文所述:

代码语言:javascript
复制
<service name="ServiceManager">
  <port name="servicemanager_1" binding="tns:servicemanager_1Binding">
    <soap:address location="http://localhost/servicemanager/1"/>
  </port>
</service>

它的位置是:localhost。Zeep (IMHO正确地)使用该服务端点与服务器进行通信。我所做的测试:我SSH-隧道80/443端口到本地主机,所以zeep认为它与本地主机。沙扎姆成功了。

所以我的服务器是罪魁祸首--可惜我无法改变,因为我无法控制它。但现在解决办法是可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45265464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档