Прокси подписав SOAP звонок - PullRequest
0 голосов
/ 21 января 2020

У меня есть фиктивный сервер, построенный с Python / Django, который получает SOAP запросов на представление и возвращает предопределенный набор ответов.

Это отлично работает, но я также хотел бы " proxy "запрос к реальному SOAP API в некоторых случаях.

Моя первоначальная идея состояла в том, чтобы просто получить тело запроса, отправить его в настоящий API и затем вернуть его ответ. Проблема в том, что этот SOAP API использует подпись WS-Security с самозаверяющими сертификатами. Я попытался использовать requests, но не смог заставить его работать должным образом, так что это моя последняя попытка использовать pycurl:

def post_hr(payload: bytes):
    buffer = BytesIO()

    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, "https://webservices.kvk.nl/postbus2")
    curl.setopt(pycurl.SSL_VERIFYPEER, 0)
    curl.setopt(pycurl.SSL_VERIFYHOST, 0)
    curl.setopt(pycurl.CAINFO, settings.CA_INFO)
    curl.setopt(pycurl.SSLCERT, settings.SSL_CERT)
    curl.setopt(pycurl.POST, True)
    curl.setopt(pycurl.HTTPHEADER, ['SOAPAction: "http://es.kvk.nl/ophalenInschrijving"'])
    curl.setopt(pycurl.POSTFIELDS, payload)
    curl.setopt(pycurl.WRITEDATA, buffer)
    curl.perform()
    status = curl.getinfo(pycurl.RESPONSE_CODE)
    curl.close()
    return status, buffer.getvalue()

def view(request):
    ...
    if something:
        status, body = post_hr(request.body)
        return HttpResponse(body, status=status)

settings.CA_INFO и settings.SSL_CERT - это преобразованные сертификаты вызывающего сервера от jks до pem.

Код заставляет API возвращать ответ SOAP с кодом состояния 500 и ошибкой «Недопустимое сообщение».

Я не понимаю, как возникает эта ошибка, поскольку я просто отправляю тот же запрос, который использует соответствующий клиент.

...