Comment puis-je obtenir la clé publique d'une page Web comme verisign, etc. en utilisant le protocole HTTPS?
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.
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.
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"))