[pyar] Acceder a web service SOAP con SSL

David Arch daviddanielarch en gmail.com
Mie Jul 18 19:18:41 -03 2018


El mié., 18 de jul. de 2018 5:47 p. m., Maxi <maxirobaina en gmail.com>
escribió:

>
>
> El mié., 18 jul. 2018 a las 17:11, Leandro Minatel (<
> leandro en minatel.com.ar>) escribió:
>
>> Hola Maxi, si el sitio requiere un certificado de cliente entonces agrega
>> luego del session.verify:
>>
>> session.cert = ('path/al/crt', '/path/private_key')
>>
>
> ​No me funcionó. Hice lo siguiente
>
>
> >>> from requests import Session
> >>> from zeep.transports import Transport
> >>> from zeep import Client
> >>>
> >>> session = Session()
> >>>
> >>> session.verify = '/home/maxi/temp/certificado.crt'
> >>> session.cert = ('/home/maxi/temp/AR-E_1_1.crt',
> '/home/maxi/temp/AR-E_1_1.key')
> >>> transport = Transport(session=session)
> >>>
> >>> client = Client('https://webservicesoap:4443/TEST/Parametros?wsdl',
> transport=transport)
>
> ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
> (_ssl.c:833)
>
> Donde
>  session.verify = '/home/maxi/temp/certificado.crt'   Es el certificado
> que exporte del navegador
>
>  session.cert = ('/home/maxi/temp/AR-E_1_1.crt',
> '/home/maxi/temp/AR-E_1_1.key')   Es el certificado que originalmente es
> .pfx y lo separe en dos con openssl
>
> Ahora con
>  session.verify = False
>  session.cert = ('/home/maxi/temp/AR-E_1_1.crt',
> '/home/maxi/temp/AR-E_1_1.key')
>
> Caused by SSLError(SSLError(1, '[SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert
> unknown ca (_ssl.c:833)')
>
>
En session.verify podes poner o bien False, en cuyo caso no te va a hacer
la verificacion sobre el certificado que te manda el server una vez que
inicias la conexión (certificado que se usa para encripar todo por SSL) o
bien el self signed cert que hablábamos antes.
Eso no tiene nada que ver con la verificación de cliente.

Para la verificación del certificado de cliente tenes que usar el
certificado que te pasaron.
Eso lo pones en session.cert, para más info sobre eso tenes que consultar
la documentación de client side certificates de la lib requests (el session
es parte de requests)
http://docs.python-requests.org/en/master/user/advanced/

El problema que estas teniendo ahora seguramente es en el procesamiento que
le hiciste al certificado que te pasaron.
Proba exportarlo en algún otro formato sin separarlo o bien separandolo en
otro formato. Tené en cuenta que tenes que exportarlo sin contraseña.
Yo siempre use certs en formato .pem sin problema.


>
>
>
>
>>
>> Slds
>>
>>
>> On Wed, Jul 18, 2018 at 4:11 PM Maxi <maxirobaina en gmail.com> wrote:
>>
>>> Hola David,
>>>
>>> El mié., 18 jul. 2018 a las 14:12, David Arch (<
>>> daviddanielarch en gmail.com>) escribió:
>>>
>>>> Parece que te falta agregar el certificado de cliente.
>>>> Parece que tenes dos cosas dando vuelta:
>>>> 1) El server usa un cert autofirmado
>>>> 2) El servidor pide un certificado de cliente
>>>>
>>>> Para 1 podes o bien agregar el cert a los certs del sistema como decís
>>>> que ya hiciste o decirle al cliente de Python que no verifique el
>>>> certificado.
>>>>
>>>> Para 2 tenes que poner el path al certificado de cliente en el cliente
>>>> de Python, este certificado generalmente no es el mismo certificado que
>>>> agregaste al sistema.
>>>>
>>>
>>>
>>> ​Creo que por acá viene la mano. En tantas pruebas que hice omiti contar
>>> algo importante.
>>> En principio me dieron un certificado (.pfx​) y una contraseña. Ese
>>> certificado es el que cargue en el navegador (en mi caso en el
>>> administrador de certificados de Firefox). Cuando lo importe me pidió la
>>> contraseña de cifrado.
>>> Luego, cuando quiero acceder a la url del webseervice desde el navegador
>>> me aparece un form "Solicitud de identificación de usuario" pidiendo que
>>> seleccione el certificado a usar para identificarme. Luego si me dice que
>>> la conexión no es segura y agrego la excepción.
>>>
>>> Entonces supongo que lo que me esta faltando es indicarle a mi conexión
>>> desde python todo esto que es en lo que estoy fallando.
>>>
>>>
>>>
>>>> Si pones el código que estas usando además de los errores va ser más
>>>> fácil diagnosticar el problema.
>>>>
>>>>
>>> ​El código no es mucho más de lo que esta en la doc de zeep
>>>
>>> >>> from requests import Session
>>> >>> from zeep.transports import Transport
>>> >>> from zeep import Client
>>> >>>
>>> >>>
>>> >>> session = Session()
>>> >>> session.verify = '/home/maxi/temp/micertificado.crt'
>>> >>>
>>> >>> transport = Transport(session=session)
>>> >>>
>>> >>> client = Client('https://webservicesoap?wsdl', transport=transport)​
>>>
>>> ​Donde session.verify = '/home/maxi/temp/micertificado.crt'   es el
>>> archivo que exporte desde el navegador.​
>>>
>>>
>>> ​Saludos​
>>> _______________________________________________
>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>> Sitio web: http://www.python.org.ar/
>>>
>>> Para administrar la lista (o desuscribirse) entrar a
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
>
> --
> Maximiliano Robaina
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180718/bac2888f/attachment.html>


Más información sobre la lista de distribución pyar