2016-10-31 3 views
1

나는 suds로 만든 XML 객체에 서명하려고했지만 행운이 없다.Python (suds)을 사용하여 XML에 서명하는 방법

현재 스크립트는 다음과 같습니다.

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) 

나는 방법을 만든 다음 서명해야합니다. 나는 체크하고있는 WSDL의 공용 인증서를위한 pem 파일을 가지고있다. 또한

, 내가 얻을 요청 서명을 해달라고하는 경우 : 그 파이썬 WSSE (https://py-wsse.readthedocs.io/en/latest/) 작품을 발견

답변

1

'헤더를 처리 오류가 발견되었다'

suds.WebFault : 서버 제기 오류 매력처럼 비눗물로.

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, 
       ), 
      ], 
     )