2012-02-01 12 views
6

Tanto el cliente como el servidor son internos, cada uno tiene un certificado firmado por la CA interna y el certificado de CA. Necesito que el cliente autentique el certificado del servidor contra el certificado de CA que tiene. También debe enviar su certificado al servidor para la autenticación.Cómo crear un cliente HTTPS de doble autenticación en Python sin (L) libs GPL?

El manual urllib2 dice que la autenticación del servidor no se realiza. PycURL es una alternativa natural, pero su licencia no ha sido aprobada todavía. También preferiría no tener que compilar la biblioteca desde el código fuente sino usar RPM en su lugar.

que se pasaron un montón de bibliotecas como solicitudes, httplib2 y no veo lo que necesito. También está el módulo ssl, pero no tengo ganas de implementar http por mi mismo si no es absolutamente necesario.

Python 2.6 en RHEL 5.7

+0

Estoy frente a un problema muy similares y lo resuelvo por dejar que Apache haga todo el levantamiento de SSL –

+0

@Mikko - mi problema está en el lado del cliente, que es una utilidad de Python – davka

+0

Aha. Lo siento, no lo entendí la primera vez :( –

Respuesta

6

bueno, el ganador (casi) es httplib2 v0.7. A partir de esta versión, es compatible con la autenticación de certificados SSL. Aquí está el código de ejemplo

import httplib2 
client = httplib2.Http(ca_certs='ca.crt') 
client.add_certificate(key='client_private_key.pem', cert='cert_client.pem', domain='') 
headers, resp = client.request(query) 

Nota el parámetro domain='', no funcionó para mí de otra manera.

PS. desafortunadamente esta solución simple no funciona para mí, ya que olvidé mencionar un requisito adicional: tener la instalación de RPM para RHEL 5.7 & Python 2.6.

+1

Ojalá, podría votar esta respuesta más. Intenté solicitudes de Python, urllib3 todo sin éxito. ¡Pero esto funciona! He encontrado un nueva biblioteca de fav. – Komu

3

Twisted Python es una biblioteca que puede hacer lo que tiene, aunque no estoy seguro de si la licencia MIT se ajusta a lo que quiere. GPL es una licencia bastante específica y es de esperar que no haya querido decir "todas las licencias de código abierto".

Para ver ejemplos de SSL, vea http://twistedmatrix.com/documents/current/core/howto/ssl.html. Los últimos dos ejemplos en esa página son particularmente relevantes en función de su descripción. Twisted utiliza PyOpenSSL (docs) que tiene licencia con la licencia de Apache. También podría considerar usar PyOpenSSL directamente.

+0

gracias. Parece interesante, pero parece una exageración para mí, necesito una simple solicitud y respuesta, por lo que usar reactor sería una sobreingeniería en este caso. – davka

+0

Quizás. Si Siento que el marco es demasiado para morder en un solo trozo, use la biblioteca PyOpenSSL (enlace arriba) y hágalo a mano. Sin embargo, creo que encontrará que el nivel de esfuerzo será similar en cualquier caso. – gfortune

+0

Voy a prueba el 'httplib2' que parece adecuado y simple. Actualizaré aquí cómo fue – davka

2

Actualización: Si requests no apoyaron los certificados de cliente antes, it supports it now, proporcionan la clave privada del certificado local (si lo hay) es sin cifrar:

>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key')) 
<Response [200]> 
Cuestiones relacionadas