Python obtiene el nombre común de la URL usando ssl.getpeercert ()

Estoy intentando obtener información sobre el emisor del certificado (nombre común), pero el código del enlace no funciona con algunas URL.

¿Cómo puedo obtener la información del emisor del certificado en python?

import ssl, socket hostname = 'google.com' ctx = ssl.create_default_context() s = ctx.wrap_socket(socket.socket(), server_hostname=hostname) s.connect((hostname, 443)) cert = s.getpeercert() subject = dict(x[0] for x in cert['subject']) issued_to = subject['commonName'] >>> issued_to u'*.google.com' 

Por ejemplo, probé el nombre de host “cds.ca”, dice

 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 

pero todavía puedo obtener el nombre común utilizando Internet Explorer (* .cds.ca)

Entonces, creo que debería usar mi propio certificado (.cer) en lugar de usar getpeercert (), entonces, ¿cómo debo cambiar esa línea?

O, ¿hay alguna otra manera de lograr CN con mi propio archivo de certificado?

Si solo desea obtener el CN ​​u otros detalles del certificado, sin importar si la validación del certificado es exitosa o no, debe deshabilitar la verificación. Desafortunadamente, un simple sock.getpeercert() por diseño solo devolverá un diccionario vacío si la validación del certificado está deshabilitada. Es por eso que uno tiene que usar sock.getpeercert(True) para obtener la representación binaria del certificado y extraer el CN ​​utilizando OpenSSL.crypto de él:

 import socket import ssl import OpenSSL.crypto as crypto dst = ('cds.ca',443) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(dst) # upgrade the socket to SSL without checking the certificate # !!!! don't transfer any sensitive data over this socket !!!! ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE s = ctx.wrap_socket(s, server_hostname=dst[0]) # get certificate cert_bin = s.getpeercert(True) x509 = crypto.load_certificate(crypto.FILETYPE_ASN1,cert_bin) print("CN=" + x509.get_subject().CN)