Verwenden einer Befehlszeile Website Downloader, wie wget
, curl
oder jede andere ... In einem Skript ...
Ich habe den SHA-1 und den SHA-256 zertifizierten Fingerabdruck einer Website. Aus Sicherheitsgründen ( 1 ) ( 2 ) möchte ich das öffentliche SSL-Zertifizierungsstellensystem nicht verwenden. Der Fingerabdruck muss fest codiert sein.
Kann eine Anwendung wie wget den SSL-Fingerabdruck überprüfen?
wget hat keine solche Funktionalität. ( 3 )
Mit wget --ca-certificate
oder curl --cacert
müsste ich meine eigene lokale Zertifizierungsstelle betreiben, was ich verhindern möchte, da dies eine Menge Komplexität mit sich bringt. Es ist auch extrem schwierig und das hat noch niemand gemacht. ( 4 )
Gibt es kein Werkzeug
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com
?
Die Lösung darf natürlich nicht anfällig für TOCTOU sein. ( 5 ) Das MITM kann einen gültigen Fingerabdruck für die Anforderung des openssl-Clients zurückgeben lassen und die folgende wget-Anforderung manipulieren.
Antworten:
Quelle
Installieren Sie die erforderliche Software:
Laden Sie das öffentliche SSL-Zertifikat herunter:
Oder besser:
SHA-1-Fingerabdruck abrufen:
SHA-256-Fingerabdruck abrufen:
Vergleichen Sie die Fingerabdrücke von SHA-1 und SHA-256 manuell mit den häufig gestellten Fragen zu torproject.org: SSL .
Optional können die CA-Zertifikate für Testzwecke unbrauchbar gemacht werden. Verwenden Sie hier curl , aber wget hat einen Bug Bug und verwendet trotzdem die ca-Dateien.
Download mit Wellung und angeheftetem Zertifikat:
quelle
In tcsh:
quelle
zsh
, sollte auch für BashDas reicht auch:
quelle
-md5
Option MD5 - Fingerabdruck abrufen.-md5
darf nicht zwischen-in
und gesetzt werdenserver.crt
.Dies ist mit dem
openssl
Befehl und seiner Client-Funktionalität relativ einfach zu bewerkstelligen.Das folgende kleine Skript verwendet eine bestimmte Domäne (kein https-Präfix) und einen SHA-1-Fingerabdruck und beendet das Programm ohne Fehler (0), wenn der abgerufene Fingerabdruck übereinstimmt, aber mit dem Beendigungscode 1, wenn keine Übereinstimmung vorliegt. Sie können es dann in Ihr Skript integrieren, indem Sie einfach den letzten Beendigungscode testen
$?
:quelle
wget
, es mit OpenSSL zu modifizieren und zu kompilieren, damit es das leistet, was Sie inline wollen, aber das würde den Rahmen einer AU-Antwort sprengen.(echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443
sollte doch funktionieren, oder? Nun, Sie müssen die SSL-Sitzungsinformationen von der eigentlichen Inhaltsantwort trennen.Quelle
Wie in der Net :: SSLeay-Dokumentation beschrieben, bedeutet diese Methode eine Überprüfung nach der HTTP-Transaktion und sollte daher nicht verwendet werden, wenn Sie überprüfen möchten, ob Sie mit dem richtigen Server sprechen, bevor Sie Daten senden. Aber wenn Sie nur entscheiden, ob Sie dem, was Sie gerade heruntergeladen haben, vertrauen wollen oder nicht (was so klingt, als wären Sie aus Ihrer Referenz 4), ist dies in Ordnung.
quelle
Das ist mein alltägliches Drehbuch:
Ausgang:
quelle