Wie kann ich den öffentlichen Schlüssel einer Webseite wie Verisign usw. mithilfe des HTTPS-Protokolls abrufen?
Kommentare
- Wenn ich Ihre Frage gerade verstehe, können Sie auf das https-Protokollzeichen in Chrome oder Firefox (in der linken Ecke der Adressleiste) klicken. Dort sehen Sie einen Pop mit Details zu das Zertifikat einschließlich seines öffentlichen Schlüssels.
- @ Jor-el, ich ' gehe davon aus, dass openssl Tag, dass die Frage dazu mit OpenSSL ist. Vielleicht könnte die Frage geklärt werden.
- Eine HTTPS -Seite hat keinen öffentlichen Schlüssel. Nur ein Server hat einen öffentlichen Schlüssel und ein Zertifikat dafür, wie in den Antworten erläutert. Das ist mindestens ein Domainname und manchmal mehr als einer. Verschiedene Seiten können ' t unterschiedliche Schlüssel / Zertifikate haben, da der Server sein Zertifikat bereitstellen muss (und der Client es akzeptiert), bevor der Client den Server darüber informiert Seite wird angefordert – falls vorhanden; HTTP [S] ermöglicht Anforderungen, die ' überhaupt nicht auf eine Seite zugreifen.
Antwort
Dieser Befehl zeigt Ihnen das Zertifikat an (verwenden Sie -showcerts
als zusätzlichen Parameter, wenn Sie die gesamte Kette anzeigen möchten):
openssl s_client -connect the.host.name:443
Dadurch wird das Zertifikat abgerufen und der öffentliche Schlüssel ausgedruckt:
openssl s_client -connect the.host.name:443 | openssl x509 -pubkey -noout
Wenn Sie weiter graben möchten, Diese Frage könnte von Interesse sein.
Kommentare
- Wenn Sie diese Option ausführen CentOS 7 mit OpenSSL 1.0.2k wird der Befehl ' nach dem Drucken des Schlüssels nicht automatisch beendet.
Antwort
Gehen Sie in Google Chrome zur https-Webseite (sagen Sie https://mail.google.com ), klicken Sie auf das Schloss neben der URL, dann auf „Zertifikatinformationen“, klicken Sie auf die Registerkarte „Details“ und suchen Sie dann „Info Public Key Info“. , der für mail.google.com
den Algorithmus für den öffentlichen Schlüssel des Subjekts lautet: „PKCS # 1 RSA-Verschlüsselung“ und den öffentlichen Schlüssel des Subjekts:
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
Dies entspricht den in RSA verwendeten Dezimalzahlen N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573
und exponent=65537
.
Antwort
In Python 3 SSLSocket.getpeercert kann verwendet werden, um das Peer-Zertifikat zu erhalten, das wiederum von jedem DER-Zertifikat-Parser analysiert werden kann:
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)
Die Variable pubkey
ist jetzt eine RSAPublicKey
, wenn die Verbindung RSA verwendet. Sie können den Modul wie folgt erhalten:
print(pubkey["modulus"].native)
Oder konvertieren Sie ihn in einen öffentlichen PEM-Schlüssel wie folgt:
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))