Wie gehe ich mit Zertifikaten um, die cURL verwenden, während ich versuche, auf eine HTTPS-URL zuzugreifen?


187

Bei Curl wird der folgende Fehler angezeigt:

Curl: (77) Fehler beim Einstellen des Zertifikats zur Überprüfung der Speicherorte:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: keine

Wie lege ich die Speicherorte für dieses Zertifikat fest? Vielen Dank.


2
Auf welchem ​​Betriebssystem / welcher Distribution bist du? Sie sollten das Paket ca-certificates installieren (so heißt es auf debian / ubuntu).
igorw

40
Zum späteren Nachschlagen hatte ich bereits ca-certificatesinstalliert, aber der Fehler blieb bestehen. Das Problem war, dass sich meine Zertifikate /etc/ssl/certs/ca-certificates.crtanstelle von befanden /etc/pki/tls/certs/ca-bundle.crt, sodass ich nur die Umgebungsvariable CURL_CA_BUNDLEauf den richtigen Pfad setzen musste.
Robert Smith

13
Cool! Es funktioniert bei mir, wenn ich einstelle export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
ordentlich

Antworten:


82

Dieser Fehler hängt mit einem fehlenden Paket zusammen :ca-certificates . Es installieren.

In Ubuntu Linux (und einer ähnlichen Distribution):

# apt-get install ca-certificates

In CygWin über Apt-Cyg

# apt-cyg install ca-certificates

In Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

Die Dokumentation sagt:

Dieses Paket enthält PEM-Dateien mit CA-Zertifikaten, damit SSL-basierte Anwendungen die Authentizität von SSL-Verbindungen überprüfen können.

Wie zu sehen unter: Debian - Details der Paket-Ca-Zertifikate in Squeeze


97
ca-certificates ist bereits die neueste Version, aber ich erhalte immer noch den Fehler
Pastor Bones

2
Natürlich wird der gleiche Fehler angezeigt, wenn Sie versuchen, apt-cyg über die empfohlene Methode mit curl und raw.github.com zu installieren .
10gistic

11
Unter Arch Linux benötigen Sie möglicherweise auch pacman -S ca-certificates-utils. Ich tat.
Mark Grimes

8
Dieses Paket ist bereits installiert. Diese Antwort ist nicht hilfreich.
JimmyJames

8
@ PastorBones Ich hatte das gleiche Problem, dass das Paket bereits aktuell war. Ich denke, es war jedoch beschädigt, so dass das Paket neu sudo apt install --reinstall ca-certificatesinstalliert und die Fehler behoben wurden, die ich sah
Will

153

Ich hatte auch die neueste Version von ca-Zertifikaten installiert, bekam aber immer noch den Fehler:

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

Das Problem war, dass Curl erwartete, dass sich das Zertifikat am Pfad befand /etc/pki/tls/certs/ca-bundle.crt, es aber nicht finden konnte, weil es sich am Pfad befand/etc/ssl/certs/ca-certificates.crt .

Kopieren meines Zertifikats an das erwartete Ziel durch Ausführen

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

arbeitete für mich. Sie müssen Ordner für das Ziel erstellen, wenn diese nicht durch Ausführen vorhanden sind

sudo mkdir -p /etc/pki/tls/certs

Ändern Sie bei Bedarf den obigen Befehl, damit der Name der /etc/pki/tls/certs/ca-bundle.crtZieldatei mit dem von curl erwarteten Pfad übereinstimmt, dh ersetzen Sie ihn in Ihrer Fehlermeldung durch den Pfad nach "CAfile:".


31
Sie können auch einen symbolischen Link mit erstellen, ln -swenn Sie ihn nicht jedes Mal neu kopieren möchten, wenn Sie ihn aktualisieren.
Starbeamrainbowlabs

4
Hatte das gleiche Problem für die rescuetimeApp auf Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtlöste das Problem. ( CURL_CA_BUNDLEenv var hat nicht funktioniert)
GabLeRoux

Auf meinem Ubuntu wurde das Problem behoben : sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Ich habe tatsächlich bekommen, The repository ... does not have a Release filewas durch fehlendes Zertifikat ( Could not load certificates from ...) verursacht wurde.
Marinos An

84

Setzen Sie dies in Ihre .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(siehe Kommentar von Robert)


8
Vielen Dank, dass Sie eine Methode bereitgestellt haben, bei der ich die Systemdateien nicht von Hand durcheinander bringen muss, aber dennoch die Sicherheit der Verwendung von Zertifikaten gewährleistet!
Stephen Johnson

Danke dir. Dies löste mein ähnliches Problem mit pyenv & curl. Ich habe Ubuntu 14.04 verwendet und hatte bereits Ca-Zertifikate installiert.
DavidA

Dieser Ansatz funktioniert auch mit xonsh (hinzufügen , $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"um den .xonshrc).
m00am

Nur für den Fall: Die CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
Einzeiler-

30

Erstellen Sie eine Datei ~/.curlrcmit dem folgenden Inhalt

cacert=/etc/ssl/certs/ca-certificates.crt

1
Die beste Antwort, dies funktionierte für mich unter Linux Mint 17
Santiago

Auf dem Mac funktionierte es mit dem Folgen von in~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

20

Der schnellste Weg, um den Fehler zu umgehen, besteht darin, die Option -k irgendwo in Ihrer Curl-Anfrage hinzuzufügen. Diese Option "ermöglicht Verbindungen zu SSL-Zitaten ohne Zertifikate." (von curl --help)

Beachten Sie, dass dies bedeuten kann, dass Sie nicht mit dem Endpunkt sprechen, von dem Sie glauben, dass Sie es sind, da dieser ein Zertifikat vorlegt, das nicht von einer Zertifizierungsstelle signiert wurde, der Sie vertrauen.

Beispielsweise:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

gab mir die folgende Fehlerantwort:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

Ich fügte hinzu -k:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

und keine Fehlermeldung. Als Bonus habe ich jetzt apt-cyg installiert. Und Ca-Zertifikate.


10
Das könnte den Fehler umgehen, aber es macht auch die "sichere" Verbindung unsicher.
Tim

1
Nicht wirklich. Soweit ich weiß, können Sie die Verschlüsselung einer sicheren Verbindung nicht einfach umgehen, sodass sie immer noch verschlüsselt ist und nur zu einem Endpunkt führt. Jemand korrigiert mich, wenn ich falsch liege, aber das einzige Risiko, das Sie eingehen, besteht darin, dass Sie einem Mann-in-der-Mitte-Angriff zum Opfer fallen könnten. Immer noch kein Risiko, wenn Sie Curl verwenden.
10gistic

18
Ja wirklich. Die Option "-k" steht für "--insecure". Wenn Sie einen Mann in der Mitte haben, was macht er Ihrer Meinung nach mit Ihren Daten? Spoiler-Alarm: Er entschlüsselt es, stiehlt es und ändert es möglicherweise und injiziert es zurück in den unsicheren Stream. Direkt von der Manpage: "-k, --insecure (SSL) Mit dieser Option kann curl explizit" unsichere "SSL-Verbindungen und -Übertragungen durchführen. Alle SSL-Verbindungen werden versucht, mithilfe des standardmäßig installierten CA-Zertifikatspakets sicher gemacht zu werden. Dadurch schlagen alle als "unsicher" eingestuften Verbindungen fehl, es sei denn, -k, --insecure wird verwendet. "
Tim

2
Wenn Sie SSL benötigen, benötigen Sie Datenschutz und Bestätigung. Das -kFlag bedeutet, dass Sie die Bestätigung verlieren . Abhängig von Ihren Anforderungen kann dies akzeptabel sein. MITM sind nicht triviale Angriffe, wenn Sie davon ausgehen, dass Ihr Netzwerk und der Server, mit dem Sie kommunizieren, vor Eindringlingen geschützt sind (können Sie diese Annahme treffen?). Das Risiko steigt je nach Art Ihrer Daten (Quellcode und Zertifikate sind riskanter als Bilder). Sie können die Integrität der Daten nach der Übertragung überprüfen (Prüfsummen usw.), aber jetzt verlagern Sie Ihr Vertrauen auf diesen Prüfsummenkanal. Am Ende -kgibt Ihnen einiges mehr Arbeit.
Mark Fox

Bedeutet das auch, dass ich ein selbstsigniertes Zertifikat verwende? Ich sollte die Option -k verwenden. Wie ist es möglicherweise nicht möglich, das selbstsignierte Zertifikat zu überprüfen?
Linus

15

@roens ist richtig. Dies betrifft alle Anaconda- Benutzer mit dem folgenden Fehler
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Die Problemumgehung besteht darin, die Standard-Systemlocke zu verwenden und zu vermeiden , dass die vorangestellte Anaconda- PATHVariable durcheinander gebracht wird. Du kannst entweder

  1. Benennen Sie die Anaconda Curl-Binärdatei um :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. ODER entfernen Sie die Anaconda-Locke
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu Curl Github Problem https://github.com/conda/conda-recipes/issues/352


Guter Fund, ich wusste nicht, dass Anaconda meinen Wegvorrang stiehlt. Es hat funktioniert, als ich es durch curlden vollständigen Pfad ersetzt habe/usr/bin/curl
jxramos

Das hat sehr geholfen! Vielen Dank.
Shababb Karim

12

Von $ man curl:

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.

7

Für PHP-Code, der unter XAMPP unter Windows ausgeführt wird, musste ich die php.ini bearbeiten, um Folgendes einzuschließen

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

und dann in eine Datei https://curl.haxx.se/ca/cacert.pem kopieren und in curl-ca-bundle.crt umbenennen und unter \ xampp path ablegen (curl.capath konnte nicht funktionieren) . Ich fand auch, dass das CAbundle auf der cURL-Site nicht für die Remote-Site ausreichte, zu der ich eine Verbindung herstellte, und verwendete daher eine, die mit einer vorkompilierten Windows-Version von curl 7.47.1 unter http://winampplugins.co.uk aufgeführt ist / curl /


Unter Windows können Sie auch einfach "xampp" vor php wie folgt hinzufügen: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn

7

Ich hatte genau das gleiche Problem. Wie sich herausstellte, war meine /etc/ssl/certs/ca-certificates.crtDatei fehlerhaft. Der letzte Eintrag zeigte ungefähr so:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

Nachdem zuvor eine neue Zeile hinzugefügt -----END CERTIFICATE-----wurde, konnte curl die Zertifikatdatei verarbeiten.

Es war sehr ärgerlich, das herauszufinden, da mein update-ca-certificatesBefehl mich nicht warnte.

Dies kann ein versionsspezifisches Curl-Problem sein oder auch nicht. Der Vollständigkeit halber ist hier meine Version:

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 

6

Das hat bei mir funktioniert

sudo apt-get install ca-certificates

Gehen Sie dann in den Zertifikatsordner unter

sudo cd /etc/ssl/certs

Anschließend kopieren Sie die Datei ca-certificates.crt in die Datei /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

Wenn kein tls / certs-Ordner vorhanden ist: Erstellen Sie einen und ändern Sie die Berechtigungen mit chmod 777 -R folderNAME


1
Ich habe es versucht, aber das hat bei mir nicht funktioniert und ich bekomme immer noch den gleichen Fehler. Irgendwelche Ideen ?
Anirudh

6

Eine andere Alternative zur Behebung dieses Problems besteht darin, die Zertifikatsüberprüfung zu deaktivieren:

echo insecure >> ~/.curlrc

1
Problemumgehung, aber es hilft mir nach zu viel Zeit mit Curl-Zertifikaten. Vielen Dank.
K. Gol

4

curl führt SSLstandardmäßig eine Zertifikatüberprüfung mit einem "Bundle" von durchCertificate Authority (CA) öffentlicher Schlüssel (CA-Zertifikate) verwendet wird. Das Standardpaket heißt curl-ca-bundle.crt. Sie können eine alternative Datei mit der Option --cacert angeben.

Wenn dieser HTTPSServer ein Zertifikat verwendet, das von einer im Bundle vertretenen Zertifizierungsstelle signiert ist, ist die Zertifikatüberprüfung wahrscheinlich aufgrund eines Problems mit dem Zertifikat fehlgeschlagen (es ist möglicherweise abgelaufen oder der Name stimmt möglicherweise nicht mit dem Domänennamen in der URL überein).

Wenn Sie die Überprüfung des Zertifikats durch curl deaktivieren möchten, verwenden Sie -k (oder --insecure Option ).

beispielsweise

curl --insecure http://........

3
Abgesehen davon, dass "Vertrauen in die Quelle" hier ziemlich irrelevant ist, da Sie ohne ordnungsgemäße Validierung des Zertifikats gegen eine Zertifizierungsstelle keine Ahnung haben, wer "die Quelle" ist.
Jeff Allen


3

Erstellen Sie einfach die Ordner, die in Ihrem System fehlen.

/ etc / pki / tls / certs /

und erstellen Sie die Datei mit dem folgenden Befehl:

sudo apt-get installiere ca-Zertifikate

Kopieren Sie dann das Zertifikat und fügen Sie es in den Zielordner ein, der in Ihrem Fehler angezeigt wird. Meins war " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in". Stellen Sie sicher, dass Sie die Datei an der genauen Stelle einfügen, die im Fehler angegeben ist. Verwenden Sie den folgenden Befehl, um das Einfügen zu kopieren.

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

Fest.


Keine der Top-Antworten hat bei mir funktioniert, aber das hat funktioniert!
Prachiti Prakash Prabhu

2

Überprüfen Sie, was es wert ist which curl ist auch die Bedeutung.

Ein Benutzer auf einem von mir gepflegten freigegebenen Computer hat diesen Fehler erhalten. Die Ursache war jedoch, dass sie Anaconda ( http://continuum.io ) installiert hatten . Dadurch setzt so Anacondaâs binären Pfad vor dem Standard $PATH, und es kommt mit seinem eigenen curlbinären, den Problemen bei der Suche des Standard - Zert hatte , die waren auf diesem Ubuntu - Rechner installiert.


1
Ich empfehle, which -a curlzu überprüfen , ob alles verfügbar ist, und natürlich zu notieren, welches oben steht.
Jxramos

1

Wenn Sie Homebrew unter MacOS oder Linuxbrew unter Linux verwenden, versuchen Sie, das opensslund curlmit den folgenden Schritten auf dieser Seite neu zu installieren .

Diese Fehlermeldung zeigt an, dass curl mit openssl keine sichere Verbindung herstellen kann. Eine Neuinstallation von openssl sollte das Problem beheben. Führen Sie Folgendes aus, um vorübergehend eine unsichere Verbindung für curl und git zum Herunterladen aller erforderlichen Dateien zu verwenden:

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

Installieren oder installieren Sie dann openssl und curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Machen Sie abschließend die Sicherheitsänderungen rückgängig, damit Curl und Git wieder sichere Verbindungen verwenden:

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

Möglicherweise müssen Sie eine neue Shell-Sitzung starten, um das Ergebnis mit zu überprüfen

curl -v https://github.com # or any other https urls.

Wenn die folgende Ausgabe in der Ausgabe angezeigt wird, sollte das Problem behoben sein!

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

Verweise:


Nach stundenlangem Versuch. Das hat mich gerettet. Endlich die richtige Lösung für Macos. Vielen Dank! :)
mrateb

1

Ich habe das gleiche Problem: Ich erstelle ein alpines Docker-Image. Wenn ich mich auf eine Website meiner Organisation locken möchte, wird dieser Fehler angezeigt. Um das Problem zu lösen, muss ich das CA-Zertifikat meines Unternehmens erhalten und es dann zu den CA-Zertifikaten meines Images hinzufügen.

Holen Sie sich das CA-Zertifikat

Verwenden Sie OpenSSL, um die Zertifikate für die Website abzurufen:

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

Dies gibt ungefähr Folgendes aus:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

Holen Sie sich das letzte Zertifikat (den Inhalt zwischen dem -----BEGIN CERTIFICATE-----und dem
-----END CERTIFICATE----- enthaltenen Markups) und speichern Sie es in einer Datei (z. B. mycompanyRootCA.crt).

Bauen Sie Ihr Image auf

Wenn Sie dann Ihr Docker-Image aus Alpin erstellen, gehen Sie wie folgt vor:

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

Ihr Bild wird jetzt richtig funktionieren! \Ö/


1

Wenn jemand immer noch Probleme hat, versuchen Sie es, es hat bei mir funktioniert. Löschen Sie die Dateien in Ihrem /etc/ssl/certs/Verzeichnis und installieren Sie ca-certificates neu:

sudo apt install ca-certificates --reinstall

Hab das gemacht, als ich versucht habe, Linuxbrew zu installieren.


1
Dies hat mir geholfen, aber ich habe die Dateien auf meinem Computer nicht gelöscht. Ich habe gerade den einfachen Befehl ausgeführt und Curl hat angefangen zu arbeiten.
Josefhu15

1

Finden Sie einfach, dass diese Lösung perfekt für mich funktioniert.

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

Ich habe diese Lösung von hier aus gefunden


0

Der Fehler ist auf beschädigte oder fehlende SSL-Kettenzertifikatsdateien im PKI-Verzeichnis zurückzuführen. Sie müssen sicherstellen, dass die Dateien wie folgt gebündelt sind: In Ihrer Konsole / Ihrem Terminal:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

Geben Sie diese Site ein: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , holen Sie sich Ihr Ca-Zertifikat für SO. Kopieren Sie die URL des Downloads und fügen Sie sie in die URL ein: wget your_url_donwload_ca-ceritificated.rpm jetzt, installieren Sie Ihre RPM:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

Starten Sie jetzt Ihren Dienst neu: Mein Beispiel dieser Befehl:

sudo service2 httpd restart

0

Führen Sie den folgenden Befehl in git bash aus, der für mich gut funktioniert

git config --global http.sslverify "false"

0

Dies wurde für mich behoben:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem


0

Im Folgenden werden die Schritte zur Behebung der Probleme beschrieben.
1. Stellen Sie fest, dass die Datei in der Definitions-URL vorhanden ist.
2. Wenn nicht, laden Sie die Datei von der URL herunter. https://curl.haxx.se/ca/cacert.pem
3. Kopieren Sie die Datei und schädigen Sie sie in den definierten Pfad in der Datei php.ini.
4. Starten Sie den Apache-Dienst neu.


0

Ich hatte dieses Problem und es stellte sich heraus, dass meine CURL-Version DER-codierte Zertifikate nicht analysieren konnte (und auch die Option --cert-type nicht beachtete). Als ich das Zertifikat in das PEM-Format konvertierte, funktionierte es.


0

In meinem Fall /etc/ssl/certs/ca-certificates.crtfehlte die Datei. Wie sich herausgestellt hat, habe ich /etc/ssl/certsbeim Erstellen des Docker-Images den Inhalt von aus der Docker-Datei gelöscht . Nach dem Anpassen meiner Shell-Skripte / Bash-Befehle, die im Dockerfile ausgeführt werden, funktioniert curl jetzt perfekt im neuen Container.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.