Devo esaminare un elenco di IP e recuperare il nome comune dal certificato su quell'IP (per ogni IP che consente le connessioni 443 della porta). Sono stato in grado di farlo con successo usando i socket e i moduli ssl. Funziona su tutti gli IP con certificati firmati validi ma non funziona per i certificati autofirmati.Come posso recuperare il certificato peer TLS/SSL di un host remoto usando python?
Se io uso questo metodo, si richiede un cert valida che si verifica dal mio CA-bundle:
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()
Se rimuovo il cert_reqs=ssl.CERT_REQUIRED
quindi si connette, ma non ottiene il certificato a tutti.
Come posso recuperare il nome comune di un certificato su un indirizzo IP valido o meno rispetto al ca-bundle?
Vale anche la pena notare che se si estrae il certificato tramite ssl.getpeercert (True), è necessario caricarlo utilizzando OpenSSL.crypto.FILETYPE_ASN1 anziché FILETYPE_PEM –
Poiché la vulnerabilità "barboncino" in SSLv3 molti server Web l'hanno disabilitata. Potrebbe essere necessario aggiungere 'ssl_version = ssl.PROTOCOL_TLSv1' alla tua chiamata 'get_server_certificate (..)' se vedi qualcosa come "sslv3 alert handshake failure" –
M2Crypto chiama SocketServer, che diventa socketserver sotto python3. M2Crypto si romperà sotto python3. – mootmoot