¿Cómo puedo obtener la clave pública de una página web como verisign, etc. usando el protocolo HTTPS?
Comentarios
- Si entiendo su pregunta en ese momento, puede hacer clic en el signo del protocolo https en Chrome o Firefox (en la esquina izquierda de la barra de direcciones), allí puede ver una ventana emergente que muestra detalles sobre el certificado, incluida su clave pública.
- @ Jor-el, I ' m asumiendo de openssl etiqueta que la pregunta es sobre hacer esto con OpenSSL. Quizás la pregunta podría aclararse.
- Una página HTTPS no tiene una clave pública; solo un servidor tiene una clave pública y un certificado, como se explica en las respuestas. Eso es al menos un nombre de dominio y, a veces, más de uno. Diferentes páginas pueden ' t tener diferentes claves / certificados, porque el servidor debe proporcionar su certificado (y el cliente lo acepta) antes de que el cliente informe al servidor qué se solicita la página, si la hubiera; HTTP [S] permite solicitudes que no ' no acceden a ninguna página.
Responder
Este comando le mostrará el certificado (use -showcerts
como un parámetro adicional si desea ver la cadena completa):
openssl s_client -connect the.host.name:443
Esto obtendrá el certificado e imprimirá la clave pública:
openssl s_client -connect the.host.name:443 | openssl x509 -pubkey -noout
Si desea profundizar más, esta pregunta puede ser de interés.
Comentarios
- Al ejecutar esto en CentOS 7 con OpenSSL 1.0.2k, el comando no ' t sale automáticamente después de imprimir la clave.
Responder
En Google Chrome, vaya a la página web https (digamos https://mail.google.com ), haga clic en el candado junto a la URL, luego haga clic en «información del certificado», haga clic en la pestaña «Detalles» y luego busque «Información de clave pública del sujeto» , que para mail.google.com
dice Algoritmo de clave pública del sujeto: «Encriptación PKCS # 1 RSA» y Clave pública del sujeto:
Modulus (1024 bits): AF 39 15 98 68 E4 92 FE 4F 4F F1 BB FF 0D 2E B0 FE 25 AA BD 68 04 67 27 EA 6C 43 4C A7 6D CB C8 8F 7E 81 EE 87 26 25 10 12 54 33 9E AA 3D 9B 8F 8E 92 B3 4B 01 E3 F9 4A 29 C3 0F FD AC B7 D3 4C 97 29 3F 69 55 CF 70 83 04 AF 2E 04 6E 74 D6 0F 17 09 FE 9E 20 24 24 E3 C7 68 9C AC 11 BD 92 E4 B2 1B 09 F2 02 32 BB 55 1B 2D 16 5F 30 12 23 E2 4C 4A 8D C2 DA 3F E1 B8 BF F7 3A B1 86 BE F0 C5 Public Exponent (24 bits): 01 00 01
Esto corresponde a los números decimales N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573
y exponent=65537
utilizados en RSA.
Respuesta
En Python 3, SSLSocket.getpeercert se puede usar para obtener el certificado de pares, que a su vez puede ser analizado por cualquier analizador de certificados DER:
import ssl, socket from asn1crypto import pem, x509 hostname = "www.sjoerdlangkemper.nl" ctx = ssl.create_default_context() s = ctx.wrap_socket(socket.socket(), server_hostname=hostname) s.connect((hostname, 443)) der = s.getpeercert(binary_form=True) cert = x509.Certificate.load(der) pubkey = cert.public_key.unwrap() print(pubkey)
La variable pubkey
ahora es RSAPublicKey
si la conexión usó RSA. Puede obtener el módulo así:
print(pubkey["modulus"].native)
O convertirlo a una clave pública PEM como esta:
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))