Come posso ottenere la chiave pubblica di una pagina web come verisign, ecc. utilizzando il protocollo HTTPS?

Commenti

  • Se ho capito bene la tua domanda, puoi fare clic sul protocollo https accedi chrome o firefox (nellangolo sinistro della barra degli indirizzi), lì puoi vedere un pop che mostra i dettagli il certificato inclusa la sua chiave pubblica.
  • @ Jor-el, io ' presumo da openssl tag che la domanda riguarda come farlo con OpenSSL. Forse la domanda potrebbe essere chiarita.
  • Una pagina HTTPS non ha una chiave pubblica; solo un server ha una chiave pubblica e un certificato per essa, come spiegato nelle risposte. Questo è almeno un nome di dominio e talvolta più di uno. Pagine diverse possono ' t avere chiavi / certificati diversi, perché il server deve fornire il suo certificato (e il client lo accetta) prima che il client informi il server di cosa è richiesta la pagina – se presente; HTTP [S] consente le richieste che non ' accedono a nessuna pagina.

Risposta

Questo comando ti mostrerà il certificato (usa -showcerts come parametro extra se vuoi vedere lintera 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 approfondire, questa domanda potrebbe interessarti.

Commenti

  • Quando lo esegui su CentOS 7 con OpenSSL 1.0.2k, il comando non ' t esce automaticamente dopo aver stampato la chiave.

Risposta

In google chrome, vai alla pagina web https (ad esempio https://mail.google.com ), fare clic sul lucchetto accanto allURL, quindi fare clic su “informazioni sul certificato”, fare clic sulla scheda “Dettagli”, quindi trovare “Informazioni sulla chiave pubblica delloggetto” , che per mail.google.com dice Algoritmo della chiave pubblica del soggetto: “PKCS # 1 RSA Encryption” e 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 

Corrisponde ai numeri decimali N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

e exponent=65537 utilizzati in RSA.

Risposta

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

print(pubkey["modulus"].native) 

Oppure convertirlo in una chiave pubblica PEM come questa:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *