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"))