2

I am using SUDS soap client to make a call using the calls on a WSDL and having issues with OpenSSL.

The issue seems to come from the cert and key I'm using, but I'm unsure. For this I'm using RequestsTransport(cert=('http://localhost:90/certificate.crt', 'public_key.pem'))

The CRT file I went into the browser and saved the certificate from there, I then generated a public key from it using OpenSSL x509 -pubkey -noout -in C:\certificate.crt.

The code I am using is here:

import requests
from suds.transport.http import HttpAuthenticated
from suds.transport import Reply, TransportError
from suds.client import Client
import sys

    class RequestsTransport(HttpAuthenticated):
        def __init__(self, **kwargs):
            self.cert = kwargs.pop('cert', None)
            HttpAuthenticated.__init__(self, **kwargs)

        def send(self, request):
            self.addcredentials(request)
            resp = requests.post(request.url, data=request.message,
                                 headers=request.headers, cert=self.cert)
            result = Reply(resp.status_code, resp.headers, resp.content)
            return result

    if __name__ == '__main__':
        t = RequestsTransport(cert=('http://localhost:90/certificate.crt', 'public_key.pem'))
        headers = {"Content-Type": "text/xml;charset=UTF-8", "SOAPAction": "clientLogin"}
        client = Client('http://localhost:90/temp.wsdl', headers=headers, transport=t)
        print(client)
        response = client.service.Login('username','password','')

        print(response)
    sys.exit(0)

Would someone point me in the right direction, as I'm unsure where I have gone wrong?


Here is the exception raised by Suds:

Traceback (most recent call last):
  File "C:/GIT Repo/cpp-bdd-regression-tests/steps/test2.py", line 27, in <module>
    response = client.service.Login('username','password','')
  File "C:\Program Files (x86)\Python\lib\site-packages\suds\client.py", line 521, in __call__
    return client.invoke(args, kwargs)
  File "C:\Program Files (x86)\Python\lib\site-packages\suds\client.py", line 581, in invoke
    result = self.send(soapenv)
  File "C:\Program Files (x86)\Python\lib\site-packages\suds\client.py", line 613, in send
    reply = self.options.transport.send(request)
  File "C:/GIT Repo/cpp-bdd-regression-tests/steps/test2.py", line 18, in send
    headers=request.headers, cert=self.cert)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\api.py", line 110, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\adapters.py", line 423, in send
    timeout=timeout
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 345, in _make_request
    self._validate_conn(conn)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 844, in _validate_conn
    conn.connect()
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\connection.py", line 326, in connect
    ssl_context=context)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\util\ssl_.py", line 322, in ssl_wrap_socket
    context.load_cert_chain(certfile, keyfile)
  File "C:\Program Files (x86)\Python\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 416, in load_cert_chain
    self._ctx.use_certificate_file(certfile)
  File "C:\Program Files (x86)\Python\lib\site-packages\OpenSSL\SSL.py", line 596, in use_certificate_file
    _raise_current_error()
  File "C:\Program Files (x86)\Python\lib\site-packages\OpenSSL\_util.py", line 48, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('system library', 'fopen', 'Unknown error'), ('BIO routines', 'FILE_CTRL', 'system lib'), ('SSL routines', 'SSL_CTX_use_certificate_file', 'system lib')]
halfer
  • 19,824
  • 17
  • 99
  • 186
Sam
  • 1,207
  • 4
  • 26
  • 50
  • *"Python Suds making WSDL calls throws an OpenSSL.SSL.Error"* - well, are you going to tell us what the error is, or would you like us to guess? – jww Mar 15 '17 at 18:37
  • It just shows OpenSSL I will paste the full trace here for you tomorrow sorry – Sam Mar 15 '17 at 21:16
  • @jww I have uploaded the stacktrace now – Sam Mar 16 '17 at 09:49
  • The `fopen` error in the `BIO routines` suggests to me the problem is with Python locating your `openssl.cnf` file. Is [`OPENSSL_CONF`](http://stackoverflow.com/q/7360602/608639) set to a valid configuration file (it usually shows up on Windows, but it surfaces under libraries like Ruby and Python, too)? However, I am not a Python guy, so I could be completely wrong. – jww Mar 16 '17 at 10:47

0 Answers0