我正在使用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)。
答案 0 :(得分:6)
suds
客户端使用suds.transport.Transport
的子类来处理请求。
使用的默认传输是suds.transport.https.HttpAuthenticated
的实例,但是当您通过传递transport
关键字参数来实例化客户端时,可以覆盖此实例。
通过创建urlopener,使用urllib.request
(或urllib2
for python2)实现http和https传输。用于创建此urlopener的处理程序列表由calling传输类上的u2handlers()
方法检索。这意味着您可以通过继承默认值并覆盖该方法来创建自己的传输,以使用具有特定HTTPSHander的ssl 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