Pregunta

Tengo un problema para obtener la página html del servidor https.El acceso al recurso está protegido con la verificación del certificado del cliente (en un navegador debo elegir el certificado adecuado para acceder a la página).

Estoy tratando de usar Python http.client biblioteca como esta:

import http.client
conn = http.client.HTTPSConnection('example.com', 443, key_file = 'tmp/private.pem', cert_file = 'tmp/public.pem')
conn.set_debuglevel(0)
conn.request('GET', '/index.htm')
result = conn.getresponse()
if result.status != http.client.ACCEPTED:
  pass
print(result.status, result.reason)
conn.close()

Como resultado de este programa obtengo: 403 Forbidden.¿Qué estoy haciendo mal?

Tenga en cuenta que puedo acceder a este recurso directamente a través del navegador.Las claves públicas y privadas se extraen del archivo pkcs12 exportado desde ese navegador con comandos openssl (openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem y openssl pkcs12 -nokeys -in cert.p12 -out public.pem)

¿Fue útil?

Solución

Como hasta ahora no he recibido ninguna respuesta, me gustaría compartir con ustedes lo que hice y cómo resolví este problema.

Probé el ejemplo de código que está en esta pregunta de StackOverflow y modifíquelo ligeramente a Python3:

from urllib.request import Request, urlopen, HTTPSHandler, build_opener
from urllib.error import URLError, HTTPError
import http.client

class HTTPSClientAuthHandler(HTTPSHandler):

  def __init__(self, key, cert):
    HTTPSHandler.__init__(self)
    self.key = key
    self.cert = cert

  def https_open(self, req):
    return self.do_open(self.getConnection, req)

  def getConnection(self, host, timeout=300):
    return http.client.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)

opener = build_opener(HTTPSClientAuthHandler(private_key_file, public_key_file))
response = opener.open("https://example.com/index.htm")
print response.read()

Y acaba de empezar a funcionar.Todavía no sé cómo resolver mi problema original, pero al menos sé cómo evitarlo.

¡Espero que te ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top