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

时间:2016-05-19 15:11:01

标签: python ssl suds

我正在使用SUDS来使用网络服务。我试着像吼一样:

client = Client(wsdl_url)
list_of_methods = [method for method in client.wsdl.services[0].ports[0].methods]
print(list_of_methods)

我收到了这个错误:

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

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

6 个答案:

答案 0 :(得分:6)

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

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

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

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())

答案 1 :(得分:4)

此代码对我有用:

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)

答案 2 :(得分:1)

您可以使用https://pypi.python.org/pypi/suds_requests来利用请求库进行传输。这使您能够禁用ssl验证。

或者尝试我的新肥皂库,它支持开箱即用:http://docs.python-zeep.org/en/latest/#transport-options

答案 3 :(得分:1)

您可以在实例化suds客户端之前添加以下代码:

import ssl


try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

有关详细信息,请访问我自己的网站:https://lucasmarques.me/bypass-ssl/

答案 4 :(得分:1)

这是我提出的似乎运作良好的方法:

class MyTransport(HttpAuthenticated):

    def u2handlers(self):
        """
        Get a collection of urllib handlers.

        @return: A list of handlers to be installed in the opener.
        @rtype: [Handler,...]

        """
        handlers = []
        context = ssl._create_unverified_context()
        handlers.append(urllib2.HTTPSHandler(context=context))
        return handlers

干杯!

答案 5 :(得分:0)

我用这个:

with mock.patch('ssl._create_default_https_context', ssl._create_unverified_context):
    client = Client(url)

请参阅:https://bitbucket.org/jurko/suds/issues/78/allow-bypassing-ssl-certificate#comment-39029255