Verwenden von Client-Zertifikaten mit wget

8

Ich kann wget nicht dazu bringen, die Client-Zertifikate zu verwenden. In der Dokumentation wird die Verwendung des Flags --certificate beschrieben.

Die Verwendung des Zertifikat-Flags ist klar. Ich habe festgelegt, dass die PEM-Version des Client-Zertifikats verwendet wird.

Aber wenn ich mich verbinde, erhalte ich den folgenden Fehler:

HTTP request sent, awaiting response... Read error (error:14094410:SSL routines:
SSL3_READ_BYTES:sslv3 alert handshake failure; error:140940E5:SSL routines:SSL3_
READ_BYTES:ssl handshake failure) in headers.
Giving up.

Ein SSL-Handshake-Fehler bedeutet, dass der Client kein korrektes Client-Zertifikat angegeben hat. Das von mir verwendete Client-Zertifikat funktioniert immer noch in einem Browser.

Hinweis: Wenn ich die Clientauthentifizierung auf dem Server deaktiviere, kann wget eine Verbindung herstellen. Hinweis: Die Verwendung von Curl wird empfohlen, aber ich möchte den Wechsel vermeiden.

Bart De Vos
quelle
Ich habe eine Problemumgehung durchgeführt: Definieren Sie einen VirtualHost in Apache ohne Clientzertifikatauthentifizierung, setzen Sie DocRoot auf dasselbe Verzeichnis und setzen Sie Zulassen von auf die lokale Hostadresse.

Antworten:

7

Ich habe eine Woche darüber studiert, schließlich mit der Hilfe, die ich von dieser Seite bekommen habe.

Der Befehl, den ich zum Verbinden verwendet habe, lautet:

wget --ca-cert=/etc/ssl/certs/winhostname.pem --certificate=/etc/ssl/private/linuxhost.pem \
     --private-key=/etc/ssl/private/linuxhost.key https://winhostname.home.net:8443/winhosturl.asmx
Wouter
quelle
du hast meinen Tag gerettet!
Peter Butkovic
4

Sind Sie sicher, dass die SSL-Clientzertifikatauthentifizierung für Ihren Server funktioniert?

Ich habe gerade getestet, ob ich mein Zertifikat (im PKCS12-Format) in eine Zertifikats- und Schlüsseldatei im PEM-Format konvertieren und mit wget verwenden kann.

Ich kann drei Fehlerzustände provozieren, von denen keiner mit dem übereinstimmt, was Sie melden:

  1. Meine Schlüsseldatei konnte nicht angegeben werden: 400 Bad Request
  2. Bereitstellung eines fehlerhaften Schlüssels: EVP_DecryptFinal_ex: fehlerhafte Entschlüsselung von OpenSSL
  3. Bereitstellung eines gültigen Zertifikats, das dem Server nicht gefällt: 403 verboten

Ich benutze Nginx; Sie erwähnen nicht, was Sie verwenden, daher bin ich mir nicht sicher, ob Apache dieselben Antworten zurückgeben würde.

Ich würde vorschlagen, Ihr Zertifikat und Ihren Schlüssel zu nehmen, es in PKCS12 zu kombinieren (oder es einfach als PEM zu importieren, wenn Ihr Browser das Format unterstützt) und sicherzustellen, dass zuerst alles an dieser Front funktioniert.

Wenn Sie dies bereits getan haben, können Sie möglicherweise von einem anderen Computer aus versuchen, sicherzustellen, dass die von Ihnen verwendete OpenSSL-Version nicht seltsam ist.

Versuchen Sie zuletzt, OpenSSL im s_client-Modus zu verwenden:

openssl s_client -cert cert.pem -key req.pem -connect host:port -debug

Und sehen Sie, ob die Dinge auf dieser Ebene funktionieren. Wenn ja, dann ist etwas mit wget wackelig und Sie möchten es möglicherweise neu erstellen oder neu installieren. Wenn nicht, kann Ihnen die Ebene der Debug-Ausgabe dabei helfen, das Problem besser zu lokalisieren als die Debug-Ausgabe von wget.

James F.
quelle
Ich habe alle Ihre Vorschläge ausprobiert: 1. Cert funktioniert einwandfrei in FF 3.5 2. Server: Apache 2.2.11, Openssl 0.9.8i, Windows Server 2003-Client: WGET 1.11.4, OpenSSL 0.9.8k (binär), Win XP SP3 3 Von einer anderen Maschine: gleiches Ergebnis 4. Ich habe das Zertifikat von Comodo erhalten. Zertifikat und Schlüssel sind alle in einem. Ich habe Folgendes versucht: openssl s_client -cert cert.pem openssl s_client -cert cert.pem -key key.key (aus cert extrahiert) openssl s_client -cert cert.pem -key copyofcert.pem (Fortsetzung im nächsten Kommentar)
Alle gaben den gleichen Fehler aus: <br> Fehler beim Festlegen des privaten Schlüssels <br> 8584: Fehler: 0B080074: x509-Zertifikat <br> Routinen: X509_check_private_key: Schlüsselwerte <br> Beachten Sie, dass dies ein anderer Fehler ist als über der Nichtübereinstimmung :. \ Crypto \ x509 \ x509_cmp.c: 399:
Sie verwirren Ihre Zertifikate und Schlüssel. Bis Sie es mit openssl s_client zum Laufen bringen, können Sie sicher sein, dass Sie die falsche Datei (Inhalt) an wget übergeben. Schauen Sie in die Dateien und sehen Sie, ob sie markiert sind (normalerweise mit --- BEGIN PRIVATE KEY --- oder --- BEGIN RSA KEY --- oder --- BEGIN CERTIFICATE --- ... etc .. .das wird Ihnen sagen, was in den Dateien ist)
Ram
2

Ich habe wget erfolgreich wie folgt verwendet:

"C:\program files\GnuWin32\bin\wget" --no-check-certificate --certificate=C:\Users\Alex\xxx.pem --private-key=C:\Users\Alex\xxx.pem --input-file=retain.url --output-document=retain.xml

Beachten Sie die --private-key option. keep.url hat https: //bla.bla.bla

Jetzt werden Sie jedoch aufgefordert, die PEM-Passphrase einzugeben:

Wenn ich das Passwort eingebe, funktioniert es in Ordnung, aber kennt jemand einen Weg, um die Eingabeaufforderung zu umgehen?

Bart De Vos
quelle
4
Erstellen Sie eine Kopie des Schlüssels ohne Passphrase: openssl rsa -in key.pem -out keyout.pem
pehrs
0

Ist es möglich, dass wget eine Verbindung zu Port 80 herstellt? Dieser Fehler ist sehr ähnlich zu Fehlern, die ich beim Testen erhalte, wenn HTTP versehentlich 80 und 443-wget abhört und versucht, SSL zu sprechen, und nicht die gewünschte Antwort erhält.

Josh Budde
quelle
Nee. Die URL befindet sich in einem Skript und ist daher immer dieselbe. Und wenn ich mit ausgeschalteter Clientauthentifizierung, aber eingeschaltetem https teste, funktioniert es.
0

Holen Sie sich eine Netzwerkerfassung und laden Sie sie in Wireshark. Dies sollte Ihnen ein klareres Bild davon geben, was auf SSL / TLS-Ebene fehlschlägt.


quelle
0

In Versionen wie 0.9.8 gab es Probleme mit SSLv3.

Versuchen Sie, -no_ticket an openssl s_client zu übergeben oder wenn -ssl2 funktioniert

Artifex
quelle