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?
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 .curlrc
und in Ihrem Home-Verzeichnis ablegen. sudo
Befehle benötigen diese Datei möglicherweise in /var/root
Die Datei akzeptiert die gleichen Optionen wie die Befehlszeile, jedoch ohne Bindestriche. Eine Option pro Zeile:
cacert=/path/to/my/certs.pem
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 sudo
die 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 -d
Flag 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
Das steht wirklich im Ausgabehinweis:
echo insecure >> ~/.curlrc
Der Vorteil der Verwendung der obigen Lösung besteht darin, dass sie für alle curl
Befehle 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 $PATH
oder aufruft /usr/bin/curl
), können Sie die Ports certsync
und in dieser Reihenfolge installieren.curl
certsync
ist ein Tool und eine entsprechende launchd plist, die Ihren Systemschlüsselbund exportiert $prefix/etc/openssl/cert.pem
und einen Symlink installiert $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pem
, damit MacPorts curl automatisch die Zertifikate abholt. certsync
aktualisiert die generierten Dateien auch automatisch, wenn Sie Ihren Systemschlüsselbund ändern.
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 curl
funktioniert (unter OSX Sierra), mussten wir das Zertifikat in importieren System.keychain
und 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 -d
manuell 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.
SecCertificateCreateFromData: Unknown format in import.
Jakob Tomlinson
Dan
zick
root
-verfügbar.curlrc
anstelle von--insecure
. Was genau so steht – für einen Angreifer in der Netzwerkposition wäre es für MITM trivial, Code einzuschleusen.Jakob Tomlinson