So beheben Sie Curl: (60) SSL-Zertifikat: Ungültige Zertifikatkette bei Verwendung von sudo

12

Da das Mavericks-Upgrade Curl mehr Probleme mit Zertifikaten hat.

Beim Versuch, eine Datei von meinem Webserver mit ihrem selbstsignierten Zertifikat zu locken, wurde der Fehler "SSL-Zertifikat: Ungültige Zertifikatkette" angezeigt.

Dies wurde korrigiert, indem das Zertifikat meinem Systemschlüsselbund hinzugefügt und so eingestellt wurde, dass immer SSL zulässig ist. Informationen, die ich hier und hier gefunden habe .

Dies funktioniert gut und wenn ich eine Datei locke, wird sie ordnungsgemäß heruntergeladen.

Wenn ich jedoch zuvor Curl mit sudo ausführe (z. B. habe ich ein Skript, das mit sudo ausgeführt werden muss und darin ein Curl ausführt), kehre ich zur gleichen Fehlermeldung zurück.

Ich vermute, dass root vielleicht nicht aus dem Systemschlüsselbund liest?

Kennt jemand einen Weg, dies zu beheben?

Jacob Tomlinson
quelle

Antworten:

16

Wenn Sie Ihre CA-Zertifikate im Dateisystem (im PEM-Format) speichern, können Sie curl anweisen, sie zu verwenden

sudo curl --cacert /path/to/cacert.pem ...

Sie können die Zertifikatsüberprüfung auch mit deaktivieren

sudo curl --insecure ...

Bearbeiten: In Bezug auf Feedback aktualisiert

Wenn Sie dies dauerhaft festlegen möchten, sollten Sie .curlrcDateien erstellen und in Ihrem Home-Verzeichnis ablegen. sudoBefehle benötigen diese Datei möglicherweise in /var/rootDie Datei verwendet dieselben Optionen wie die Befehlszeile, jedoch ohne Bindestriche. Eine Option pro Zeile:

cacert=/path/to/my/certs.pem
Dan
quelle
Vielen Dank für Ihre Antwort. Das Skript, das mit sudo ausgeführt wird, stammt von einem Drittanbieter. Daher kann ich den Befehl curl selbst nicht wirklich ändern. Unsicher ist eigentlich keine Option. Kann das global gemacht werden?
Jacob Tomlinson
Sie können eine .curlrc-Datei erstellen und in Ihrem Home-Ordner speichern. Mit sudo muss sie jedoch möglicherweise /var/root/.curlrc sein. Die Datei sollte Optionen ohne Bindestriche enthalten, eine pro Zeile. Also "cacert = / path / to / my / certs.pem"
Dan
1
+1 zum Einrichten eines root-verfügbaren .curlrcanstelle von --insecure. Genau so heißt es - für einen Angreifer in der Netzwerkposition wäre es für MITM trivial, Code einzufügen.
Zigg
Danke dafür, hört sich nach dem an, wonach ich suche. Ich werde es morgen versuchen und Kopfgeld vergeben, wenn es funktioniert.
Jacob Tomlinson
5

Root liest nicht aus den aktuellen Benutzervertrauenseinstellungen, es gibt jedoch sowohl Administratorvertrauenseinstellungen als auch rootbenutzerspezifische Vertrauenseinstellungen. (Diese unterscheiden sich auch von den Systemvertrauenseinstellungen .) Beachten Sie auch, dass sich die Einstellungen für die Zertifikatvertrauensstellung etwas vom Hinzufügen eines Zertifikats zu einem Schlüsselbund unterscheiden. Sie können ein Zertifikat als vertrauenswürdig markieren, ohne es vollständig hinzuzufügen. (Die genaue Situation hier ist mir nicht klar, und die Dokumente, die ich gesehen habe, sind vage.)

Sie können ein Zertifikat für Ihren aktuellen Benutzer als vertrauenswürdig markieren

$ security add-trusted-cert /path/to/cert.pem

aber das hilft nicht bei root. Die Lösung ist, wie Sie jetzt vielleicht erraten, entweder sudodie oben genannte, die es dann als vertrauenswürdig für den Root-Benutzer markiert:

$ sudo security add-trusted-cert /path/to/cert.pem

oder um das -dFlag zu verwenden, um es zu den Administrator-Vertrauenseinstellungen hinzuzufügen:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X öffnet einen Passwortdialog, um diesen zu bestätigen.)

Beides scheint für beide ausreichend zu sein sudo curl.

Referenz: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html

Wes Campaigne
quelle
Wie ich in der Frage sagte, habe ich sie bereits zum Systemschlüsselbund sowie zum Anmeldeschlüsselbund hinzugefügt.
Jacob Tomlinson
Haben Sie tatsächlich versucht, was ich vorgeschlagen habe? Ich habe es genau in der von Ihnen beschriebenen Situation getestet und es hat funktioniert. Ich bin mir nicht über alle Details im Klaren - die Dokumentation ist vage -, aber Sie sollten wissen, dass die Einstellungen für die Vertrauenswürdigkeit von Zertifikaten NICHT gleichbedeutend mit dem Hinzufügen des Zertifikats zu einem Schlüsselbund sind und dass die Vertrauensstellungen für Administratorzertifikate sowohl vom System als auch vom System getrennt existieren Benutzereinstellungen / Schlüsselanhänger. (Es scheint auch einen root-benutzerspezifischen Satz von Benutzereinstellungen in der Mischung zu geben.) Ich habe meine Antwort bearbeitet, um diesbezüglich klarer zu sein. Bitte versuchen Sie diese Lösung.
Wes Campaigne
Ja, ich habe diese Lösung ausprobiert, als Sie sie zum ersten Mal veröffentlicht haben. Die Zertifikate befinden sich im Systemschlüsselbund und sind als vertrauenswürdig festgelegt. Immer noch kein Glück.
Jacob Tomlinson
4

Das steht wirklich im Ausgabehinweis:

echo insecure >> ~/.curlrc

Der Vorteil der Verwendung der oben genannten Lösung besteht darin, dass sie für alle curlBefehle funktioniert. Sie wird jedoch nicht empfohlen, da sie MITM-Angriffe verursachen kann, indem eine Verbindung zu unsicheren und nicht vertrauenswürdigen Hosts hergestellt wird.

Zinken
quelle
2

Wenn Sie MacPorts verwenden (und das von Ihnen erwähnte Skript eines Drittanbieters es nicht entfernt $PATHoder aufruft /usr/bin/curl), können Sie die Ports certsyncund curlin dieser Reihenfolge installieren .

certsyncist ein Tool und eine entsprechende Startliste, die Ihren Systemschlüsselbund in $prefix/etc/openssl/cert.pemeinen Symlink exportiert und diesen installiert, $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pemdamit MacPorts Curl die Zertifikate automatisch abruft. certsyncaktualisiert die generierten Dateien auch automatisch, wenn Sie Ihren Systemschlüsselbund ändern.

Neverpanic
quelle
Vielen Dank dafür. Ich möchte jedoch die Verwendung von MacPorts nach Möglichkeit vermeiden.
Jacob Tomlinson
-1

Damit dies sudo curlfunktioniert (unter OSX Sierra), mussten wir das Zertifikat in das importieren System.keychainund dort vertrauen. Dies kann manuell in der Schlüsselbund-App oder mit diesem Befehl erfolgen:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Es war wichtig, -dden Pfad zum Systemschlüsselbund über anzugeben und manuell festzulegen -k, um sicherzustellen, dass das Zertifikat tatsächlich dort importiert wird, wenn es noch nicht vorhanden ist.

Der Befehl funktioniert ohne sudo, fragt dann aber über ein UI-Dialogfeld nach dem Kennwort, was eine Hürde für Skripte sein könnte.

Alexander Klimetschek
quelle
Ich bekomme den FehlerSecCertificateCreateFromData: Unknown format in import.
rraallvv
Wer auch immer herabgestimmt hat, bitte wissen Sie, dass ich eindeutig "auf OSX Sierra" geschrieben habe und dies eine funktionierende Lösung für uns war. Wenn es in neueren OSX-Versionen nicht funktioniert, liegt dies möglicherweise daran, dass sich die OSX-Unterstützung oder -Tools geändert haben. Oder ein Problem wie der vorherige Kommentator, bei dem die Eingabedatei nicht in einem unterstützten Format vorliegt (die Frage gibt dies nicht an).
Alexander Klimetschek