Wie lade ich das SSL-Zertifikat von einer Website herunter?

Antworten:

246

Um das Zertifikat herunterzuladen, müssen Sie den in openssl integrierten Client wie folgt verwenden:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Dadurch wird das Zertifikat in gespeichert /tmp/$SERVERNAME.cert.

Sie können verwenden, -showcertswenn Sie alle Zertifikate in der Kette herunterladen möchten. Wenn Sie jedoch nur das Serverzertifikat herunterladen möchten, müssen Sie keine Angaben machen-showcerts

echo -n gibt eine Antwort an den Server, so dass die Verbindung freigegeben wird

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'Entfernt Informationen zur Zertifikatskette und zu den Verbindungsdetails. Dies ist das bevorzugte Format zum Importieren des Zertifikats in andere Keystores.

Sean Reifschneider
quelle
9
Ich schätze, dass Sie nicht nur eine gute Antwort, sondern auch eine genaue Erklärung gegeben haben.
24.
Ist -showcertszeigen auch den Server / Blatt cert? Ich dachte, es werden nur Zwischenprodukte angezeigt, wenn dieser Schalter enthalten war.
Mike B
Wie in der Antwort angegeben, wird s_clientimmer das Server-Zertifikat angezeigt (falls vorhanden, dh der Server antwortet auf "Hallo" und wählt keine anonyme Suite aus). -showcertsZeigt alle empfangenen Zertifikate an, zuerst Server-Zertifikat, dann Intermediates und / oder Root.
Dave_thompson_085
4
Dies funktioniert jedoch nicht in der Anwesenheit eines Proxys.
Frederick Nord,
2
Dies funktioniert auch nicht mit Servern, die SNI verwenden (mehrere Zertifikate / Domänen auf einer einzigen IP-Adresse). Um Probleme zu vermeiden, geben Sie den Servernamen-Parameter von openssl an: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage den
60

Ich habe die Antwort gefunden. Openssl bietet es.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}

RainDoctor
quelle
2
auch openssl x509 -text <<EOF cert-text EOFDetails des Zertifikats zu sehen
Papis
2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemMit freundlicher Genehmigung von serverfault.com/questions/139728/…
pulkitsinghal
Dies bewirkt dasselbe und überspringt den sedHack.
phs
Hiermit wird nur ein Zertifikat überprüft. Was passiert, wenn der Dienst Teil einer Gruppe von Servern mit Lastenausgleich ist, von denen jeder ein anderes Zertifikat hat, das möglicherweise von einer anderen Stammzertifizierungsstelle signiert wurde? Mit anderen Worten, ein Mitm-Angriff kann dazu führen, dass diese Anforderung an die reale Site weitergeleitet und dann andere Anforderungen an seine Server weitergeleitet werden. Gibt es Möglichkeiten, dies zu überprüfen? Und um eine Liste aller Zertifikate zu erhalten, die eine Domain wirklich hat?
Jens Timmerman
@JensTimmerman "Mit anderen Worten, ein Mitm-Angriff kann dazu führen, dass diese Anforderung an die reale Site weitergeleitet und dann andere Anforderungen an seine Server weitergeleitet werden." Dies ist nur möglich, wenn der Mann in der Mitte ein gültiges Zertifikat für den Zielserver hat (oder der Client das Serverzertifikat nicht überprüft). Offensichtlich können Sie nur hoffen, wenn der Server manchmal ein anderes Zertifikat anbietet, diese möglicherweise alle zu erhalten, indem Sie die Verbindungsversuche wiederholen.
David Tonhofer
22

Das GNUTLS- Client-Tool gnutls-clikann dies auch einfach machen:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Das Programm soll der Site einen interaktiven Client bereitstellen. Sie müssen ihm daher eine leere Eingabe (in diesem Beispiel von /dev/null) geben, um die interaktive Sitzung zu beenden.

große Nase
quelle
1
Wie würde es Gnutls dazu bringen, sich über den (systemweit konfigurierten) https-Proxy zu verbinden und das Zertifikat auszudrucken, das es austauscht?
Frederick Nord
9

Basierend auf der Antwort von @bignose ist hier eine in sich geschlossene Version, die zB gut zu einem Kochrezept passt:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
oDDsKooL
quelle
6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

Dieser Modus von openssl erwartet stdin, also stellen wir es über zur Verfügung true |. Dies verbindet sich mit dem Server, der im Parameter -connect angegeben ist. 2>/dev/nullStellt Fehler still (optional), können wir die gesamte Ausgabe an den x509-Parser übergeben und angeben, dass /dev/stdindie Shell-Pipe als Eingabedatei verwendet werden soll. Und das wird Ausgang nur die -----BEGIN CERTIFICATE-----zu -----END CERTIFICATE-----Teil der s_clientAusgabe. Sie können dies in eine Datei umleiten, indem Sie > google.com.pemsie am Ende des Befehls einfügen.


Wie ich am besten beurteilen kann, überprüft dies nicht die Zertifikatskette, sondern nur die vom Endserver bereitgestellte SSL-Identität.

ThorSummoner
quelle
2
(1) dies verbessert die Antworten von vor 6 Jahren nicht wirklich. (2) x509liest standardmäßig stdin, -in /dev/stdinist also redundant. (3) s_clientüberprüft, ob das Serverzertifikat korrekt mit einem lokalen Vertrauensanker (root) verkettet ist und nicht abgelaufen ist, aber Sie haben Die Informationen, die dies anzeigen würden, wurden unterdrückt. (4) Es wird NICHT auf Widerruf überprüft. (5) Der Name wird nur in 1.0.2 und dann nicht standardmäßig im Serverzertifikat überprüft danach)
dave_thompson_085
@ dave_thompson_085, die Frage ist, wie man ein Zertifikat herunterlädt, aber keine Ketteninformationen anzeigt. Ich mag die openssl x509 viel besser als in einer anderen Antwort sed.
Der_Meister
0

Alternative Syntax unter Verwendung von Ex und Prozessersetzung:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
Kenorb
quelle