es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Firmar cuerpo de solicitud de WSDL utilizando archivo JKS.

Tengo que llamar a un WSDL para acceder a los servicios de una puerta de enlace para mi aplicación, pero mi problema es que para acceder a sus servicios tengo que firmar el cuerpo de todas las solicitudes usando un archivo JKS. El lenguaje de mis aplicaciones es Python y estoy usando la biblioteca suds para enviar mi solicitud, pero no puedo averiguar cómo firmar el cuerpo de la solicitud usando JKS.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para firmar el cuerpo de las solicitudes WSDL con JKS en Python utilizando Suds, puede seguir los siguientes pasos:

    1. Instale la biblioteca PyJKS utilizando pip ejecutando el comando pip install pyjks.
    2. Cargue el archivo JKS y obtenga la clave privada y el certificado utilizando la biblioteca PyJKS:

      import jks
      
      ks = jks.KeyStore.load("ruta/al/almacen.jks", "contraseña_del_almacen")
      pk_entry = ks.private_keys["alias_de_la_clave"]
      private_key = pk_entry.pkey
      cert = bytes(pk_entry.cert_chain[0].encoded)
      

    3. Utilice la clave privada para firmar el cuerpo de la solicitud utilizando la biblioteca PyXMLSec:
      import xmlsec
      
      def add_signature(body):
         sign_template = """
         <ds:signature xmlns:ds='http://www.w3.org/2000/09/xmldsig#'>
             <ds:signedinfo>
                 <ds:canonicalizationmethod algorithm='http://www.w3.org/2001/10/xml-exc-c14n#'></ds:canonicalizationmethod>
                 <ds:signaturemethod algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'></ds:signaturemethod>
                 <ds:reference uri='#Body'>
                     <ds:transforms>
                         <ds:transform algorithm='http://www.w3.org/2001/10/xml-exc-c14n#'></ds:transform>
                     </ds:transforms>
                     <ds:digestmethod algorithm='http://www.w3.org/2001/04/xmlenc#sha256'></ds:digestmethod>
                     <ds:digestvalue></ds:digestvalue>
                 </ds:reference>
             </ds:signedinfo>
             <ds:signaturevalue></ds:signaturevalue>
             <ds:keyinfo>
                 <ds:x509data>
                     <ds:x509certificate></ds:x509certificate>
                 </ds:x509data>
             </ds:keyinfo>
         </ds:signature>
         """
         signature = xmlsec.template.create(sign_template, xmlsec.TransformExclC14N, xmlsec.TransformRsaSha256)
         ref = signature.find(xmlsec.NodeReference)
         ref.uri = '#Body'
         ref.append_xmlsec(xmlsec.NodeTransform, algorithm=xmlsec.TransformExclC14N)
         digest = ref.find(xmlsec.NodeDigestMethod)
         digest.algorithm = xmlsec.TransformSha256
         signer = xmlsec.SignatureContext()
         signer.key = xmlsec.Key.from_memory(private_key, cert, xmlsec.KeyDataFormatPem)
         signer.sign(signature.find(xmlsec.NodeSignedInfo))
         signature_value_node = xmlsec.tree.find_node(signature, xmlsec.NodeSignatureValue)
         signature_value_node.text = str(signer.signature_value)
         x509_data_node = xmlsec.tree.find_node(signature, xmlsec.NodeX509Data)
         x509_cert_node = xmlsec.tree.find_node(x509_data_node, xmlsec.NodeX509Certificate)
         x509_cert_node.text = cert.decode('utf8')
         return xmlsec.tree.find_node(body, node=xmlsec.NodeBody).append(signature)
      
    4. Envíe la solicitud utilizando Suds llamando a la función add_signature como un postprocessor:
      from suds.client import Client
      
      client = Client("http://ruta/al/wsdl")
      client.set_options(soapheaders=..., postprocessor=add_signature)
      response = client.service.metodo(...)
      

    Con estos pasos, debería poder firmar el cuerpo de las solicitudes WSDL utilizando un archivo JKS en Python utilizando Suds.

Comments are closed.