it-swarm.dev

Come ottenere la chiave pubblica di una pagina Web sicura?

Come posso ottenere la chiave pubblica di una pagina Web come Verisign, ecc. Utilizzando il protocollo HTTPS?

28
shalki

Questo comando ti mostrerà il certificato (usa -showcerts come parametro aggiuntivo se vuoi vedere l'intera catena):

openssl s_client -connect the.Host.name:443

Questo otterrà il certificato e stamperà la chiave pubblica:

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

Se vuoi scavare ulteriormente, questa domanda potrebbe essere di interesse.

60
Bruno

In google chrome, vai alla pagina Web https (ad esempio https://mail.google.com ), fai clic sul lucchetto accanto all'URL, quindi fai clic su "informazioni certificato", fai clic sul "Dettagli", quindi trova "Informazioni chiave pubblica oggetto", che per mail.google.com dice l'algoritmo della chiave pubblica del soggetto: "Crittografia RSA PKCS n. 1" e la chiave pubblica del soggetto:

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

Ciò corrisponde ai numeri decimali N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

e exponent=65537 utilizzato in RSA.

10
dr jimbob

In Python 3, SSLSocket.getpeercert può essere utilizzato per ottenere il certificato peer, che a sua volta può essere analizzato da qualsiasi parser di certificati 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 variabile pubkey ora è RSAPublicKey se la connessione utilizzava RSA. Puoi ottenere il modulo in questo modo:

print(pubkey["modulus"].native)

O convertilo in una chiave pubblica PEM in questo modo:

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