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

Seit dem Mavericks-Upgrade hat curl also mehr Probleme mit Zertifikaten.

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

Dies wurde korrigiert, indem das Zertifikat zu meinem Systemschlüsselbund hinzugefügt und so eingestellt wurde, dass SSL immer zugelassen wird, Informationen, die ich hier und hier gefunden habe .

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

Wenn ich Curl jedoch zuvor mit sudo ausführe (z. B. ich habe ein Skript, das mit sudo ausgeführt werden muss und darin eine Curl ausführt), erhalte ich wieder dieselbe Fehlermeldung.

Ich vermute, dass root vielleicht nicht aus dem System-Schlüsselbund liest?

Kennt jemand eine Möglichkeit, dies zu beheben?

Antworten (6)

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 Zertifikatsprüfung auch mit ausschalten

sudo curl --insecure ...

Edit: Aktualisiert im Hinblick auf Feedback

Wenn Sie dies dauerhaft einstellen möchten, sollten Sie eine Datei erstellen .curlrcund in Ihrem Home-Verzeichnis ablegen. sudoBefehle benötigen diese Datei möglicherweise in /var/rootDie Datei akzeptiert die gleichen Optionen wie die Befehlszeile, jedoch ohne Bindestriche. Eine Option pro Zeile:

cacert=/path/to/my/certs.pem
Vielen Dank für Ihre Antwort, das Skript, das mit sudo ausgeführt wird, stammt von einem Drittanbieter, und daher kann ich den Curl-Befehl selbst nicht wirklich ändern. Unsicher ist nicht wirklich eine Option. Kann man das global machen?
Sie können eine .curlrc-Datei erstellen und in Ihrem Home-Ordner speichern, obwohl es bei Verwendung von sudo möglicherweise /var/root/.curlrc sein muss. Die Datei sollte Optionen ohne Bindestriche enthalten, eine pro Zeile. Also " cacert=/path/to/my/certs.pem "
+1 zum Einrichten eines root-verfügbar .curlrcanstelle von --insecure. Was genau so steht – für einen Angreifer in der Netzwerkposition wäre es für MITM trivial, Code einzuschleusen.
Danke dafür, klingt nach dem was ich suche. Ich werde es morgen ausprobieren und Prämie vergeben, wenn es funktioniert.

Root liest nicht aus den aktuellen Benutzer-Vertrauenseinstellungen, aber es gibt sowohl Administrator-Vertrauenseinstellungen als auch root-benutzerspezifische Vertrauenseinstellungen. (Diese unterscheiden sich auch von den Systemvertrauenseinstellungen .) Beachten Sie auch, dass sich die Zertifikatsvertrauenseinstellungen etwas vom einfachen 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 mit root. Die Lösung, wie Sie jetzt vielleicht erraten haben, ist entweder sudodie obige, die sie dann speziell für den Root-Benutzer als vertrauenswürdig 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 dieses zu bestätigen.)

Eine der beiden letztgenannten scheint für ausreichend zu sein sudo curl.

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

Wie ich in der Frage sagte, habe ich sie bereits zum System-Schlüsselbund sowie zum Login-Schlüsselbund hinzugefügt.
Hast du wirklich versucht, was ich vorgeschlagen habe? Ich habe es genau in der Situation getestet, die Sie beschreiben, und es hat funktioniert. Mir sind nicht alle Details klar – die Dokumentation ist vage – aber Sie sollten wissen, dass Zertifikats-Vertrauenseinstellungen NICHT ganz gleichbedeutend mit dem einfachen Hinzufügen des Zertifikats zu einem Schlüsselbund sind und dass die Administrator-Zertifikats-Vertrauenseinstellungen sowohl vom System als auch separat existieren Benutzereinstellungen/Schlüsselbunde. (Es scheint auch einen Root-Benutzer-spezifischen Satz von Benutzereinstellungen in der Mischung zu geben.) Ich habe meine Antwort so bearbeitet, dass sie in diesem Punkt klarer ist. Bitte versuchen Sie diese Lösung.
Ja, ich habe diese Lösung ausprobiert, als Sie sie zum ersten Mal gepostet haben. Die Zertifikate befinden sich im Systemschlüsselbund und sind als vertrauenswürdig festgelegt. Immer noch kein Glück.

Das steht wirklich im Ausgabehinweis:

echo insecure >> ~/.curlrc

Der Vorteil der Verwendung der obigen Lösung besteht darin, dass sie für alle curlBefehle funktioniert, aber sie wird nicht empfohlen, da sie MITM-Angriffe einführen kann, indem sie sich mit unsicheren und nicht vertrauenswürdigen Hosts verbindet.

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 in dieser Reihenfolge installieren.curl

certsyncist ein Tool und eine entsprechende launchd plist, die Ihren Systemschlüsselbund exportiert $prefix/etc/openssl/cert.pemund einen Symlink installiert $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pem, damit MacPorts curl automatisch die Zertifikate abholt. certsyncaktualisiert die generierten Dateien auch automatisch, wenn Sie Ihren Systemschlüsselbund ändern.

Danke dafür, ich möchte die Verwendung von MacPorts jedoch möglichst vermeiden.

Die gesuchte Dokumentation finden Sie hier. Es erklärt, wie Sie cURL auf Mavericks verwenden und wie Sie Ihre Zertifikate bereitstellen: http://curl.haxx.se/mail/archive-2013-10/0036.html

Damit es sudo curlfunktioniert (unter OSX Sierra), mussten wir das Zertifikat in importieren System.keychainund ihm 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, den Pfad zum Systemschlüsselbund sowohl anzugeben als auch -dmanuell festzulegen -k, um sicherzustellen, dass das Zertifikat tatsächlich dort importiert wird, falls dies noch nicht geschehen ist.

Der Befehl funktioniert ohne sudo, würde dann aber über einen UI-Dialog nach dem Passwort fragen, was für Skripte eine Hürde darstellen könnte.

Ich bekomme den FehlerSecCertificateCreateFromData: Unknown format in import.
Wer auch immer abgelehnt hat, bitte beachten Sie, dass ich eindeutig "on OSX Sierra" geschrieben habe und dies eine funktionierende Lösung für uns war. Wenn es in neueren OSX-Versionen nicht funktioniert, kann dies daran liegen, dass sich die OSX-Unterstützung oder -Werkzeuge geändert haben. Oder ein Problem wie der vorherige Kommentator, bei dem die Eingabedatei nicht in einem unterstützten Format vorliegt (in der Frage wird dies nicht angegeben).