当我使用SUDS进行消费Web服务时,绕过SSL

Pee*_*yte 4 python ssl suds

我正在使用SUDS来使用Web服务.我试着像吼一样:

client = Client(wsdl_url)
list_of_methods = [method for method in client.wsdl.services[0].ports[0].methods]
print(list_of_methods)
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)>
Run Code Online (Sandbox Code Playgroud)

我看到链接,但它只是python 2.7的解决方案.如何通过SUDS绕过SSL?或者是否有任何python解决方案(例如在Windows操作系统中添加假证书)?我正在使用python 3(所以我必须使用urllib而不是urllib2).

mat*_*ata 7

一个suds客户端使用的一个子类suds.transport.Transport来处理请求.

使用的默认传输是一个实例suds.transport.https.HttpAuthenticated,但是当您通过传递transport关键字参数来实例化客户端时,可以覆盖它.

http和https传输是通过创建urlopener 使用urllib.request(或urllib2用于python2)实现的.用于创建此urlopener处理程序的列表是通过检索调用u2handlers()对运输类的方法.这意味着您可以通过继承默认值并覆盖该方法来创建自己的传输,以使用具有特定ssl上下文HTTPSHander,例如:

from suds.client import Client
from suds.transport.https import HttpAuthenticated
from urllib.request import HTTPSHandler
import ssl

class CustomTransport(HttpAuthenticated):

    def u2handlers(self):

        # use handlers from superclass
        handlers = HttpAuthenticated.u2handlers(self)

        # create custom ssl context, e.g.:
        ctx = ssl.create_default_context(cafile="/path/to/ca-bundle.pem")
        # configure context as needed...
        ctx.check_hostname = False

        # add a https handler using the custom context
        handlers.append(HTTPSHandler(context=ctx))
        return handlers

# instantiate client using this transport
c = Client("https://example.org/service?wsdl", transport=CustomTransport())
Run Code Online (Sandbox Code Playgroud)


Nir*_*ana 7

这段代码对我有用:

from suds.client import Client
import ssl

if hasattr(ssl, '_create_unverified_context'):
    ssl._create_default_https_context = ssl._create_unverified_context
cli = Client('https://your_lik_to?wsdl')

print(cli)
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案确实回答了这个问题,但我认为应该有一个警告,即使用该解决方案会让您很容易不知道您是否正在连接到受信任的服务器或正在连接到模仿受信任服务器的服务器。我建议实现接受的答案中描述的自定义传输——这需要更多的努力,但应该比完全禁用 SSL 验证提供更多的保护 (2认同)