Ich hatte soeben (mal wieder) die Anforderung, möglichst skriptgesteuert OpenSSL-Zertifikate von Webservern herunterzuladen und deren Fingerprint anzuzeigen (warum zum Geier zeigen die meisten Netz-Clients einen Fingerprint in der GUI zwar an, lassen es aber nicht zu, ihn als Text zu markieren und zu kopieren?).
Ein guter Anlaß, die ganzen Skript-Tools für die "üblichen Verdächtigen" mal zusammenzutragen.
SSL (insbes. https)
openssl hat ja eine schier unglaubliche Menge an Parametern und Optionen - unter anderem bietet openssl mit s_client
und s_server
einen primitiven SSL-Client/Server.
Zertifikate herunterladen
Folgender Oneliner läd ein Zertifikat und gibt es auf stdout aus:
echo "" | openssl s_client -connect $SERVER:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Fingerprint anzeigen
So zeigt openssl den SHA1-Fingerprint eines Zertifikats an:
openssl x509 -noout -fingerprint -in $CERTFILE
Läßt man den -in
-Parameter weg, so liest openssl die Daten von stdin; so läßt sich der Befehl an obige Kommandozeile mit einer weiteren Pipe anflanschen.
SSH
ssh hat freundlicherweise für solche Operationen einzelne Tools, so daß man sich nicht durch Berge von Optionen durchwühlen muß...
Zertifikate von Servern einsammeln
Um eine die Zertifikate von einer Liste von Servern einzusammeln, gibt es das Kommandozeilen-Tool ssh-keyscan
:
ssh-keyscan host1 [host2...]
Die Ausgabe erfolgt auf stdout in dem Format, das auch die known_hosts-Datei besitzt. Alternativ kann die Liste der Server auch aus einer Datei eingelesen werden. Desweiteren bietet ssh-keyscan auch die Option, die Servernamen in der Ausgabe nur als Hash anzuzeigen.
Fingerprint anzeigen
Bei der Verbindung mit einer noch unbekannten Maschine bekommt man den Fingerprint angezeigt... auf dem Server befindet sich jedoch nur die Public-Key-Datei (typischerweise in /etc/ssh/ssh_host_dsa_key.pub). Möchte man sich für eine solche Public-Key-Datei den Fingerprint berechnen lassen, so kann man dies folgendermaßen tun:
ssh-keygen -l -f $PUBLICKEYFILE