Hoe kan ik de publieke sleutel van een webpagina zoals verisign, etc. verkrijgen met behulp van HTTPS-protocol?
Opmerkingen
- Als ik je vraag goed begrijp, kun je op het https-protocol-teken in chrome of firefox klikken (in de linkerhoek van de adresbalk), daar zie je een pop met details over het certificaat inclusief de openbare sleutel.
- @ Jor-el, ik ' m uitgaande van de openssl tag waar de vraag over gaat om dit te doen met OpenSSL. Misschien kan de vraag worden verduidelijkt.
- Een HTTPS pagina heeft geen publickey; alleen een server heeft een publickey en certificaat ervoor, zoals uitgelegd in de antwoorden. Dat is minstens één domeinnaam, en soms meer dan één. Verschillende paginas kunnen ' t verschillende sleutels / certificaten hebben, omdat de server zijn cert moet opgeven (en de client het accepteert) voordat de client de server informeert wat pagina wordt opgevraagd – indien aanwezig; HTTP [S] staat verzoeken toe die geen ' toegang hebben tot welke pagina dan ook.
Answer
Deze opdracht toont je het certificaat (gebruik -showcerts
als een extra parameter als je de volledige keten wilt zien):
openssl s_client -connect the.host.name:443
Hiermee wordt het certificaat opgehaald en de openbare sleutel afgedrukt:
openssl s_client -connect the.host.name:443 | openssl x509 -pubkey -noout
Als u verder wilt graven, deze vraag kan interessant zijn.
Opmerkingen
- Wanneer u dit op CentOS 7 met OpenSSL 1.0.2k, het commando sluit niet ' automatisch af na het afdrukken van de sleutel.
Antwoord
Ga in Google Chrome naar de https-webpagina (zeg https://mail.google.com ), klik op het slotje naast de URL, klik vervolgens op “certificaatinformatie”, klik op het tabblad “Details” en zoek vervolgens “Informatie openbare sleutel onderwerp” , die voor mail.google.com
Algoritme van de openbare sleutel van het onderwerp zegt: “PKCS # 1 RSA-codering” en de openbare sleutel van het onderwerp:
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
Dit komt overeen met de decimale getallen N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573
en exponent=65537
gebruikt in RSA.
Antwoord
In Python 3, SSLSocket.getpeercert kan worden gebruikt om het peer-certificaat te verkrijgen, dat op zijn beurt kan worden geparseerd door elke DER-certificaatparser:
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)
De variabele pubkey
is nu een RSAPublicKey
als de verbinding RSA gebruikte. Je kunt de modulus als volgt krijgen:
print(pubkey["modulus"].native)
Of converteer het als volgt naar een openbare PEM-sleutel:
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))