web-dev-qa-db-fra.com

Comment obtenir la clé publique d'une page Web sécurisée?

Comment puis-je obtenir la clé publique d'une page Web comme verisign, etc. en utilisant le protocole HTTPS?

28
shalki

Cette commande vous montrera le certificat (utilisez -showcerts comme paramètre supplémentaire si vous voulez voir la chaîne complète):

openssl s_client -connect the.Host.name:443

Cela obtiendra le certificat et imprimera la clé publique:

openssl s_client -connect the.Host.name:443 | openssl x509 -pubkey -noout

Si vous voulez creuser plus loin, cette question pourrait vous intéresser.

60
Bruno

Dans google chrome, accédez à la page Web https (par exemple https://mail.google.com ), cliquez sur le cadenas à côté de l'URL, puis cliquez sur "informations sur le certificat", cliquez sur le Onglet "Détails", puis recherchez "Informations sur la clé publique du sujet", qui pour mail.google.com indique l'algorithme de la clé publique du sujet: "PKCS # 1 RSA Encryption" et la clé publique du sujet:

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

Cela correspond aux nombres décimaux N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

et exponent=65537 utilisé dans RSA.

10
dr jimbob

Dans Python 3, SSLSocket.getpeercert peut être utilisé pour obtenir le certificat d'homologue, qui à son tour peut être analysé par n'importe quel analyseur de certificat 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 est maintenant un RSAPublicKey si la connexion utilise RSA. Vous pouvez obtenir le module comme ceci:

print(pubkey["modulus"].native)

Ou convertissez-le en une clé publique PEM comme ceci:

print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))
0
Sjoerd