Cum pot obține cheia publică a unei pagini web precum verisign etc. folosind protocolul HTTPS?

Comentarii

  • Dacă înțeleg întrebarea dvs. chiar atunci, puteți face clic pe semnarea protocolului https în Chrome sau Firefox (în colțul din stânga al barei de adrese), acolo puteți vedea un pop care arată detalii despre certificatul, inclusiv cheia sa publică.
  • @ Jor-el, eu ' presupunând din openssl eticheta că întrebarea este despre a face acest lucru cu OpenSSL. Poate că întrebarea ar putea fi clarificată.
  • O pagină HTTPS nu are o cheie publică; numai un server are o cheie publică și un certificat pentru aceasta, așa cum se explică în răspunsuri. Acesta este cel puțin un nume de domeniu și, uneori, mai mult de unul. Pagini diferite pot ' t să aibă chei / certuri diferite, deoarece serverul trebuie să furnizeze certificatul său (iar clientul să îl accepte) înainte ca acesta să informeze serverul ce pagina este solicitată – dacă există; HTTP [S] permite solicitări care nu ' nu accesează deloc nicio pagină.

Răspuns

Această comandă vă va arăta certificatul (utilizați -showcerts ca parametru suplimentar dacă doriți să vedeți întregul lanț):

openssl s_client -connect the.host.name:443 

Aceasta va primi certificatul și va imprima cheia publică:

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

Dacă doriți să săpați mai departe, această întrebare ar putea fi de interes.

Comentarii

  • Când rulați acest lucru pe CentOS 7 cu OpenSSL 1.0.2k, comanda nu ' nu iese automat după tipărirea cheii.

Răspuns

În Google Chrome, accesați pagina web https (spuneți https://mail.google.com ), faceți clic pe blocarea de lângă adresa URL, apoi faceți clic pe „informații despre certificat”, faceți clic pe fila „Detalii”, apoi găsiți „Informații despre subiectul cheii publice” , care pentru mail.google.com spune Algoritmul subiectului cheii publice: „PKCS # 1 Criptare RSA” și cheia publică a subiectului:

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 

Aceasta corespunde numerelor zecimale N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

și exponent=65537 utilizate în RSA.

Răspuns

În Python 3, SSLSocket.getpeercert poate fi utilizat pentru a obține certificatul peer, care la rândul său poate fi analizat de orice analizor al certificatului 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) 

Variabila pubkey este acum un RSAPublicKey dacă conexiunea utilizează RSA. Puteți obține modulul astfel:

print(pubkey["modulus"].native) 

Sau îl puteți converti într-o cheie publică PEM astfel:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *