Necesito escanear a través de una lista de IP y recuperar el nombre común del certificado en esa IP (para cada IP que permita las conexiones del puerto 443). He podido hacer esto con éxito utilizando los sockets y los módulos ssl. Funciona para todas las direcciones IP con certificados válidos y firmados, pero no funciona para los certificados autofirmados.¿Cómo puedo recuperar el certificado de par TLS/SSL de un host remoto utilizando python?
Si utilizo este método, se requiere un certificado válido que es verificado por mi CA-paquete:
from socket import socket
import ssl
s = socket()
c = ssl.wrap_socket(s,cert_reqs=ssl.CERT_REQUIRED, ca_certs='ca-bundle.crt')
c.connect(('127.0.0.1', 443))
print c.getpeercert()
Si quito el cert_reqs=ssl.CERT_REQUIRED
continuación, se conecta pero no recibe el certificado en absoluto.
¿Cómo puedo recuperar el nombre común para un certificado en un IP si se valida contra el paquete ca o no?
También vale la pena señalar que si extrae el certificado a través de ssl.getpeercert (Verdadero), debe cargarlo usando OpenSSL.crypto.FILETYPE_ASN1 en lugar de FILETYPE_PEM –
Dado que la vulnerabilidad "Poodle" en SSLv3 muchos servidores web lo han deshabilitado. Es posible que deba agregar 'ssl_version = ssl.PROTOCOL_TLSv1' a su llamada' get_server_certificate (..) 'si ve algo como" fallo de handshake de alerta de sslv3 " –
M2Crypto llame a SocketServer, que cambia a socketserver en python3. M2Crypto se romperá bajo python3. – mootmoot