Use Python para acceder a un sitio con seguridad PKI

Tengo un sitio que tiene la seguridad PKI habilitada. Cada cliente usó un lector de tarjetas para cargar su certificado, o el certificado se instala en el almacenamiento de certificados de IE en su caja.

Así que mi pregunta es:

  1. ¿Cómo puedo usar el certificado del lector de tarjetas o el certificado almacenado en el sistema para verificarlo?
  2. ¿Cómo paso las credenciales en el sitio para decir, hey soy yo y puedo acceder al servicio? Ellos ejemplo pueden estar utilizando certificados blandos. Puedo averiguar la parte del lector de tarjetas más tarde.

He estado buscando y no he encontrado nada que me ayude en esta situación. Django tiene un montón de módulos, pero esta no es una opción porque solo me preocupa el lado del cliente. No estoy creando un sitio para alojar el servicio. Necesito solo acceder a estos servicios.

Tengo este código funcionando de alguna manera. Simplemente no sé cómo manejar la redirección que estoy recibiendo:

import httplib KEYFILE = r"C:\cert\my.key" CERTFILE = r"c:\cert\my.pem" HOSTNAME = 'machine.com' conn = httplib.HTTPSConnection( HOSTNAME, key_file = KEYFILE, cert_file = CERTFILE ) conn.putrequest('GET', '/arcgis/sharing/rest?f=json') conn.endheaders() response = conn.getresponse() print response.read() 

El resultado de todo esto es:

   302 Found  

Found

The document has moved here.

Cualquier ayuda proporcionada sería genial!

Especificaciones de software: Python 2.7.8, Windows 2012 R2

Creé un controlador de PKI para manejar las solicitudes para poder usarlo en la biblioteca urllib2 de trabajo.

 import httplib, urllib2 class HTTPSClientAuthHandler(urllib2.HTTPSHandler): def __init__(self, key, cert): urllib2.HTTPSHandler.__init__(self) self.key = key self.cert = cert def https_open(self, req): #Rather than pass in a reference to a connection class, we pass in # a reference to a function which, for all intents and purposes, # will behave as a constructor return self.do_open(self.getConnection, req) def getConnection(self, host, timeout=300): return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert, timeout=timeout) 

Para usar esto, necesitarás usar un cookiejar con el controlador.

 from cookielib import CookieJar cookiejar = CookieJay() handlers = [] handlers.append(HTTPSClientAuthHandler(somekey, somecert)) handlers.append(urllib2.HTTPCookieProcessor(cookiejar)) opener = urllib2.build_opener(*handlers) ... do other urllib2 calls .... 

Espero que esto ayude a todos!

Prueba este codigo

 #!/usr/bin/env python import httplib CERTFILE = '/home/robr/mycert' HOSTNAME = 'localhost' conn = httplib.HTTPSConnection( HOSTNAME, key_file = CERTFILE, cert_file = CERTFILE ) conn.putrequest('GET', '/ssltest/') conn.endheaders() response = conn.getresponse() print response.read()