Cómo verificar el certificado SSL en Python
importar?os
importar?glob
desde?OpenSSL.SSL?import?Context,?TLSv1_METHOD,?VERIFY_PEER,?VERIFY_FAIL_IF_NO_PEER_CERT,?OP_NO_SSLv2 p>
desde?OpenSSL.crypto?import?load_certificate,?FILETYPE_PEM
desde?twisted.python.urlpath?import?URLPath
desde?twisted.internet.ssl? import?ContextFactory
desde?twisted.internet?import?reactor
desde?twisted.web.client?import?getPage
certificateAuthorityMap?=?{}
for?certFileName?in?glob.glob("/etc/ssl/certs/*.pem"):
#?¿Podría?haber?algunos?muertos? enlaces simbólicos?allí,?así que?asegurémonos?de?que?sea?real.
if?os.path.exists(certFileName):
datos?=?open( certFileName).read()
x509?=?load_certificate(FILETYPE_PEM,?data)
digest?=?x509.digest('sha1')
#?Ahora,?desduplicar?en?caso?el?mismo?certificado?tiene?múltiples?nombres.
certificateAuthorityMap[digest]?=?x509
clase?HTTPSVerifyingContextFactory (ContextFactory):
def?__init__(self,?hostname):
self.hostname?=?hostname
isClient?=?True
def?getContext(self):
ctx?=?Context(TLSv1_METHOD)
store?=?ctx.get_cert_store()
para ?value?in?certificateAuthorityMap.values():
store.add_cert(value)
ctx.set_verify(VERIFY_PEER?|?VERIFY_FAIL_IF_NO_PEER_CERT,?self.verifyHostname)
ctx.set_options(OP_NO_SSLv2)
retorno?ctx
def?verifyHostname(self,?conexión,?x509,?errno,?profundidad,?preverifyOK): p>
if?preverifyOK:
if?self.hostname?!=?x509.get_subject().commonName:
retu
rn?False
return?preverifyOK
def?secureGet(url):
return?getPage(url,?HTTPSVerifyingContextFactory(URLPath.fromString(url). netloc))
def?done(resultado):
imprimir?'¡Listo!',?len(resultado)
secureGet("/"). addCallback(done)
reactor.run()
Esta verificación requiere la instalación de la biblioteca Twisted.
Por supuesto, existen muchas bibliotecas de este tipo, como: pycurl, request, M2Cryptoimport?requests
requests.get('',?cert='/path/server.crt' ,?verificar =Verdadero)