2016-10-31 9 views
1

Я пытаюсь подписать объект XML, созданный suds, но мне не повезло.Как подписать XML с python (suds)

Мой текущий сценарий выглядит так.

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

import requests 

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, 
      verify=True 
     ) 
     result = Reply(resp.status_code, resp.headers, resp.content) 
     return result 

url = 'URL' 
headers = {"Content-Type": "text/xml;charset=UTF-8", 
      "SOAPAction": ""} 
t = RequestsTransport(cert=("path to cert","path to key")) 
client = Client(url, headers=headers, transport=t) 

Я создаю метод, а затем мне нужно его подписать. У меня есть файл pem для публичного сертификата WSDL, который я проверяю.

Кроме того, если я не подписать запрос, я получаю:

suds.WebFault: Сервер поднял ошибку: «была обнаружена ошибка обработки заголовка»

ответ

1

Я обнаружил, что питон-wsse (https://py-wsse.readthedocs.io/en/latest/) работ с пеной, как шармом.

from suds.client import Client 
    from suds.wsse import Security, Timestamp 
    from wsse.suds import WssePlugin 

    def get_client(our_keyfile_path, our_certfile_path, their_certfile_path): 
     wsse = Security() 
     wsse.tokens.append(Timestamp()) 

     return Client(
      wsdl_url, 
      transport=transport, 
      wsse=wsse, 
      plugins=[ 
       WssePlugin(
        keyfile=our_keyfile_path, 
        certfile=our_certfile_path, 
        their_certfile=their_certfile_path, 
       ), 
      ], 
     )