Wie kann ich LWP erhalten, um zu überprüfen, dass das Zertifikat des Servers, mit dem ich mich verbinde, von einer vertrauenswürdigen Autorität signiert und an den richtigen Host ausgegeben wurde? Soweit ich das beurteilen kann, prüft es nicht einmal, ob das Zertifikat den Hostnamen angibt, mit dem ich mich verbinde. Das scheint eine große Sicherheitslücke zu sein (besonders bei den jüngsten DNS-Sicherheitslücken).Wie kann ich LWP dazu bringen, SSL-Serverzertifikate zu validieren?
Update: Es stellt sich heraus, was ich wirklich wollte war HTTPS_CA_DIR
, weil ich keine ca-bundle.crt habe. Aber HTTPS_CA_DIR=/usr/share/ca-certificates/
hat den Trick gemacht. Ich nenne die Antwort trotzdem als akzeptiert, weil sie nahe genug war.
Update 2: Es stellt sich heraus, dass HTTPS_CA_DIR
und HTTPS_CA_FILE
gelten nur, wenn Sie als die zugrunde liegende SSL-Bibliothek Net :: SSL verwenden. Aber LWP arbeitet auch mit IO :: Socket :: SSL, das diese Umgebungsvariablen ignoriert und gerne mit jedem Server kommuniziert, egal welches Zertifikat es präsentiert. Gibt es eine allgemeinere Lösung?
Update 3: Leider ist die Lösung immer noch nicht abgeschlossen. Weder Net :: SSL noch IO :: Socket :: SSL prüft den Hostnamen gegen das Zertifikat. Dies bedeutet, dass jemand ein legitimes Zertifikat für eine bestimmte Domain erhalten kann und sich dann als eine andere Domain ausgeben kann, ohne sich beschweren zu müssen.
Update 4:LWP 6.00 löst schließlich das Problem. Details siehe my answer.
Nein, die akzeptierte Lösung leidet nicht unter diesem Problem. (Ok, ich habe es selbst geschrieben.) LWP 6 vergleicht den Common Name standardmäßig mit dem Hostnamen und bricht ab, wenn sie nicht übereinstimmen. (Sie haben Recht, dass frühere Versionen von LWP dies nicht taten.) – cjm
Das ist nicht korrekt, ich verwende die neueste Version von LWP :: UserAgent (Version 6.04) als Backend für SOAP :: Lite (Version 0.714). Das Backend von LWP :: UserAgent ist IO :: Socket :: SSL auf diesem Rechner. Ich habe festgestellt, dass ohne den oben genannten Code weder das CN geprüft noch die Zertifikatskette verifiziert wird. Die Verwendung von ssl_opts() zum Festlegen von "verify_hostname" und "SSL_ca_path" hatte keine Auswirkungen. – blumentopf
Ich wette, Sie haben entweder '$ ENV {PERL_LWP_SSL_VERIFY_HOSTNAME}', '$ ENV {HTTPS_CA_FILE}' oder '$ ENV {HTTPS_CA_DIR}' gesetzt, von denen jeder die Überprüfung des Hostnamens deaktivieren kann. – cjm