Jak radzić sobie z certyfikatami za pomocą cURL podczas próby uzyskania dostępu do adresu URL HTTPS?

188

Otrzymuję następujący błąd przy użyciu curl:

curl: (77) błąd ustawienia certyfikatu sprawdź lokalizacje:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  Ścieżka: brak

Jak ustawić ten certyfikat, aby weryfikować lokalizacje? Dzięki.

moorecats
źródło
2
Na jakim systemie operacyjnym / dystrybucji korzystasz? Powinieneś zainstalować pakiet ca-certyfikaty (tak się nazywa na debian / ubuntu).
igorw
40
Do przyszłego użytku mam już ca-certificateszainstalowany, ale błąd nadal występował. Problem polegał na tym, że /etc/ssl/certs/ca-certificates.crtzamiast nich znajdowały się moje certyfikaty /etc/pki/tls/certs/ca-bundle.crt, musiałem więc ustawić zmienną środowiskową CURL_CA_BUNDLEna właściwą ścieżkę.
Robert Smith,
13
Chłodny! Działa dla mnie, kiedy ustawiam export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
schludny

Odpowiedzi:

83

Ten błąd dotyczy brakującego pakietu : ca-certificates. Zainstaluj to.

W Ubuntu Linux (i podobnej dystrybucji):

# apt-get install ca-certificates

W CygWin przez Apt-Cyg

# apt-cyg install ca-certificates

W Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

Dokumentacja mówi:

Ten pakiet zawiera pliki PEM certyfikatów CA, aby umożliwić aplikacjom opartym na SSL sprawdzanie autentyczności połączeń SSL.

Jak widać na: Debian - Szczegóły pakietu ca-certyfikatów w squeeze

Rubens Mariuzzo
źródło
97
Ca-certyfikaty to już najnowsza wersja, ale wciąż pojawia się błąd
Pastor Bones
2
Oczywiście ten sam błąd wystąpi, jeśli spróbujesz zainstalować apt-cyg za pomocą zalecanej metody przy użyciu curl i raw.github.com .
10gistic
11
W Arch Linux możesz także potrzebować pacman -S ca-certificates-utils. Zrobiłem.
Mark Grimes,
8
Ten pakiet jest już zainstalowany. Ta odpowiedź nie jest pomocna.
JimmyJames,
9
@PastorBones Miałem ten sam problem, że pakiet był już najnowszy, myślę, że został jednak uszkodzony, więc sudo apt install --reinstall ca-certificatesprzeinstalowałem pakiet i usunąłem błędy, które widziałem
Czy
153

Miałem również zainstalowaną najnowszą wersję certyfikatów ca, ale wciąż pojawiał się błąd:

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

Problem polegał na tym, że curl oczekiwał, że certyfikat będzie na ścieżce, /etc/pki/tls/certs/ca-bundle.crtale nie mógł go znaleźć, ponieważ był na ścieżce /etc/ssl/certs/ca-certificates.crt.

Skopiuj mój certyfikat do oczekiwanego miejsca docelowego, uruchamiając

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

pracował dla mnie. Będziesz musiał utworzyć foldery dla docelowego miejsca docelowego, jeśli nie istnieją przez uruchomienie

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

W razie potrzeby zmodyfikuj powyższą komendę, aby nazwa pliku docelowego była zgodna ze ścieżką oczekiwaną przez curl, tj. Zastąp /etc/pki/tls/certs/ca-bundle.crtją ścieżką po „CAfile:” w komunikacie o błędzie.

Scott Emmons
źródło
31
Możesz również utworzyć dowiązanie symboliczne, ln -sjeśli nie chcesz go kopiować za każdym razem, gdy go aktualizujesz.
starbeamrainbowlabs
4
Miał ten sam problem z rescuetimeaplikacją na Fedorze 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtrozwiązał problem. ( CURL_CA_BUNDLEenv var nie działał)
GabLeRoux
Na moim ubuntu to naprawić problem: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Właśnie dostawałem, The repository ... does not have a Release fileco było spowodowane brakującym certyfikatem ( Could not load certificates from ...).
Marinos An
84

Włóż to do swojego .bashrc

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

(patrz komentarz Roberta)

Yauhen Yakimovich
źródło
8
Dziękujemy za udostępnienie metody, która nie wymaga ode mnie ręcznego usuwania plików systemowych, ale zapewnia bezpieczeństwo korzystania z certyfikatów!
Stephen Johnson,
Dziękuję Ci. To rozwiązało mój podobny problem z Pyenv i Curl. Korzystałem z Ubuntu 14.04 i miałem już zainstalowane ca-certyfikaty.
davidA
To podejście działa również z xonsh (dodaj $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"do .xonshrc).
m00am
Na wszelki wypadek: Jedna liniowa wersja tego:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
'18
30

Utwórz plik ~/.curlrco następującej treści

cacert=/etc/ssl/certs/ca-certificates.crt
prabeesh
źródło
1
najlepsza odpowiedź, to działało dla mnie na Linux Mint 17
Santiago
Na Mac, to działało z podążając~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

Najszybszym sposobem na obejście tego błędu jest dodanie opcji -k gdzieś w żądaniu curl. Ta opcja „umożliwia połączenia z cytowaniami SSL bez certyfikatów”. (od curl --help)

Należy pamiętać, że może to oznaczać, że nie rozmawiasz z punktem końcowym, o którym myślisz, że jest, ponieważ przedstawia on certyfikat niepodpisany przez urząd certyfikacji, któremu ufasz.

Na przykład:

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

dał mi następującą odpowiedź na błąd:

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

Dodałem na -k:

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

i brak komunikatu o błędzie. Jako bonus, teraz mam zainstalowany apt-cyg. I ca-certyfikaty.

10gistic
źródło
10
Może to obejść błąd, ale powoduje również, że „bezpieczne” połączenie staje się niepewne.
Tim
1
Nie całkiem. O ile mi wiadomo, nie można po prostu ominąć szyfrowania bezpiecznego połączenia, więc nadal jest ono szyfrowane i dochodzi tylko do jednego punktu końcowego. Ktoś mnie poprawi, jeśli się mylę, ale jedyne ryzyko, na jakie ryzykujesz, polega na tym, że możesz paść ofiarą ataku człowieka w środku. Nadal nie jest prawdopodobne ryzyko, jeśli używasz zwijania.
10gistic
18
Tak naprawdę. Opcja „-k” jest skrótem dla „--insecure”. Jeśli masz człowieka w środku, jak myślisz, co on robi z twoimi danymi? Ostrzeżenie spoilera: odszyfrowuje go, kradnie, a może modyfikuje i wstrzykuje z powrotem do niepewnego strumienia. Prosto ze strony podręcznika: „-k, --insecure (SSL) Ta opcja wyraźnie pozwala programowi curl na wykonywanie„ niezabezpieczonych ”połączeń i transferów SSL. Wszystkie połączenia SSL są próbowane w celu zabezpieczenia za pomocą domyślnie zainstalowanego pakietu certyfikatów CA. Powoduje to, że wszystkie połączenia uważane za „niepewne” kończą się niepowodzeniem, chyba że użyto opcji -k, --insecure.
Tim
2
Jeśli potrzebujesz protokołu SSL, potrzebujesz prywatności i weryfikacji - -kflaga oznacza, że tracisz weryfikację. W zależności od potrzeb może to być do zaakceptowania. MITM to nietrywialne ataki, jeśli założysz, że Twoja sieć i serwer, z którym się komunikujesz, są zabezpieczone przed intruzami (czy możesz to założyć?). Ryzyko wzrasta w zależności od rodzaju danych (kod źródłowy i certyfikaty są bardziej ryzykowne niż obrazy). Możesz zweryfikować integralność danych po przesłaniu (sumy kontrolne itp.), Ale teraz przenosisz zaufanie na ten kanał sumy kontrolnej. W końcu -kdaje ci trochę więcej pracy.
Mark Fox
Czy to oznacza, że ​​jeśli używam certyfikatu z podpisem własnym. Powinienem użyć opcji -k. Czy weryfikacja certyfikatu z podpisem własnym może nie być możliwa?
Linus,
15

@roens jest poprawny. Dotyczy to wszystkich użytkowników Anaconda , z błędem poniżej
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Obejściem tego problemu jest użycie domyślnego zwijania się systemu i unikanie bałaganu w przygotowanej PATHzmiennej Anaconda . Możesz albo

  1. Zmień nazwę pliku binarnego curl Anaconda :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. LUB usuń loki Anaconda
    conda remove curl

$ which curl /usr/bin/curl

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

Harsha Manjunath
źródło
Dobre znalezisko, nie zdawałem sobie sprawy, że Anaconda kradnie mój priorytet. To zadziałało, gdy zastąpiłem curlpełną ścieżkę/usr/bin/curl
jxramos
To bardzo pomogło! Dzięki.
Shababb Karim
12

Od $ 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.
Purnachandar Rao Voleti
źródło
7

W przypadku kodu PHP działającego na XAMPP w systemie Windows stwierdziłem, że muszę edytować plik php.ini, aby uwzględnić poniżej

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

a następnie skopiuj do pliku https://curl.haxx.se/ca/cacert.pem i zmień nazwę na curl-ca-bundle.crt i umieść go pod ścieżką \ xampp (nie mogłem uzyskać curl.capath do pracy) . Odkryłem również, że CAbundle na stronie cURL nie wystarcza dla zdalnej strony, z którą się łączyłem, więc użyłem takiej, która jest wymieniona z prekompilowaną wersją curl dla systemu Windows 7.47.1 na http://winampplugins.co.uk /kędzior/

LJT
źródło
W systemie Windows możesz także po prostu dodać „xampp” przed php, tak: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn
7

Miałem dokładnie ten sam problem. Jak się okazuje, mój /etc/ssl/certs/ca-certificates.crtplik był zniekształcony. Ostatni wpis pokazywał coś takiego:

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

Po dodaniu nowego wiersza -----END CERTIFICATE-----curl był w stanie obsłużyć plik certyfikatów.

To było bardzo denerwujące, ponieważ moje update-ca-certificatespolecenie nie dało mi żadnego ostrzeżenia.

Może to być problem związany z zawijaniem się w zależności od wersji, więc oto moja wersja, dla kompletności:

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 
ShrimpPhaser
źródło
6

To zadziałało dla mnie

sudo apt-get install ca-certificates

następnie przejdź do folderu certyfikatów na

sudo cd /etc/ssl/certs

następnie skopiuj plik ca-certyfikaty.crt do /etc/pki/tls/certs

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

jeśli nie ma folderu tls / certs: utwórz go i zmień uprawnienia za pomocą chmod 777 -R folderNAME

Kwame Yeboah
źródło
1
Próbowałem tego, ale to nie działało dla mnie i nadal pojawia się ten sam błąd. Jakieś pomysły ?
Anirudh
6

Inną alternatywą rozwiązania tego problemu jest wyłączenie sprawdzania poprawności certyfikatu:

echo insecure >> ~/.curlrc
Pablo R. Mier
źródło
1
Obejście, ale pomaga mi po zbyt długim czasie z curl certyfikatów. Dzięki.
K. Gol
4

curl SSLdomyślnie dokonuje weryfikacji certyfikatu, używając „pakietu” plikuCertificate Authority (CA) kluczy publicznych (certyfikatów CA). Domyślny pakiet nazywa się curl-ca-bundle.crt; możesz określić alternatywny plik za pomocą opcji --cacert.

Jeśli ten HTTPSserwer używa certyfikatu podpisanego przez urząd certyfikacji reprezentowany w pakiecie, weryfikacja certyfikatu prawdopodobnie nie powiodła się z powodu problemu z certyfikatem (może wygasnąć lub nazwa może nie zgadzać się z nazwą domeny w adresie URL).

Jeśli chcesz wyłączyć weryfikację certyfikatu przez curl, użyj opcji -k (lub --insecure).

na przykład

curl --insecure http://........
meda
źródło
3
Pomijając fakt, że „zaufanie do źródła” nie ma tutaj znaczenia, ponieważ bez prawidłowej weryfikacji certyfikatu wobec urzędu certyfikacji nie masz pojęcia, kim jest „źródło”.
Jeff Allen
3

Po prostu utwórz foldery, których brakuje w twoim systemie.

/ etc / pki / tls / certs /

i utwórz plik za pomocą następującego polecenia,

sudo apt-get install ca-certyfikaty

a następnie skopiuj i wklej certyfikat do folderu docelowego, który pojawia się w twoim błędzie. Mój był " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" upewnij się, że wkleiłeś plik dokładnie w miejscu wskazanym w błędzie. Użyj następującego polecenia, aby skopiować wklej ..

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

Naprawiony.

Manu RS
źródło
Żadna z najlepszych odpowiedzi nie działała dla mnie, ale tak się stało!
Prachiti Prakash Prabhu
2

which curlZnaczące jest także to, że warto sprawdzać .

Użytkownik na współużytkowanym komputerze, który utrzymuję, otrzymywał ten błąd. Okazało się jednak, że zainstalowali Anacondę ( http://continuum.io ). Robi więc umieścić binarne ścieżkę Anakonda przed normą $PATH, a to przychodzi z własnym curlbinarny, który miał problem ze znalezieniem certyfikatów domyślne, które zostały zainstalowane na tym komputerze Ubuntu.

kury
źródło
1
Polecam sprawdzić, which -a curlaby zobaczyć wszystko, co jest dostępne, i oczywiście zauważyć, który z nich jest na górze.
jxramos
2

Jeśli ktoś nadal ma problemy, spróbuj tego, to zadziałało dla mnie. Usuń pliki z /etc/ssl/certs/katalogu, a następnie ponownie zainstaluj certyfikaty ca:

sudo apt install ca-certificates --reinstall

Zrobiłem to, gdy próbowałem zainstalować Linuxbrew.

Michael Enitan
źródło
1
Pomogło mi to, ale nie usunąłem plików z mojego komputera. Po prostu uruchomiłem proste polecenie i curl zaczął działać.
Josefhu15
1

Jeśli używasz homebrew na macOS lub linuxbrew w systemie Linux, spróbuj ponownie zainstalować openssli curlwykonując następujące kroki z tej strony .

Ten komunikat o błędzie wskazuje, że curl nie może nawiązać bezpiecznego połączenia za pomocą openssl. Ponowna instalacja openssl powinna rozwiązać problem. Aby tymczasowo skorzystać z niepewnego połączenia dla curl i git w celu pobrania niezbędnych plików, uruchom:

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

Następnie zainstaluj lub zainstaluj ponownie openssl i curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Na koniec cofnij zmiany zabezpieczeń, aby curl i git ponownie korzystały z bezpiecznych połączeń:

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

Może być konieczne rozpoczęcie nowej sesji powłoki, aby zweryfikować wynik

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

Jeśli pokazuje on następujące dane wyjściowe, problem powinien zostać rozwiązany!

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

Bibliografia:

Itachi
źródło
Po godzinach prób. To mnie uratowało. Wreszcie właściwe rozwiązanie dla systemu Macos. Wielkie dzięki! :)
mrateb
1

Mam ten sam problem: buduję obraz dokera w alpejskim stylu i kiedy chcę zawinąć się na stronie mojej organizacji, pojawia się ten błąd. Aby rozwiązać ten problem, muszę uzyskać certyfikat CA mojej firmy, a następnie dodać go do certyfikatu CA mojego obrazu.

Uzyskaj certyfikat CA

Użyj OpenSSL, aby uzyskać certyfikaty związane z witryną:

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

Spowoduje to wyświetlenie czegoś takiego:

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

Uzyskaj ostatni certyfikat (treść między -----BEGIN CERTIFICATE-----a
-----END CERTIFICATE----- znaczników w zestawie) i zapisać go do pliku (mycompanyRootCA.crt na przykład)

Zbuduj swój wizerunek

Następnie, gdy zbudujesz obraz dokera z alpejskiego, wykonaj następujące czynności:

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

Twój obraz będzie teraz działał poprawnie! \ o /

alphayax
źródło
1

Po prostu znajdź to rozwiązanie działa dla mnie idealnie.

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

Znalazłem to rozwiązanie stąd

Daniel
źródło
0

Błąd jest spowodowany uszkodzonymi lub brakującymi plikami certyfikatów łańcucha SSL w katalogu PKI. Musisz upewnić się, że pliki zawierają cały pakiet, wykonując następujące czynności: W konsoli / terminalu:

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

Wejdź na tę stronę: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , zdobądź certyfikat ca dla SO. Skopiuj adres URL pobierania i wklej do adresu URL: wget twoja_url_donwload_ca-ceritificated.rpm teraz, zainstaluj yout rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

teraz uruchom ponownie usługę: mój przykład to polecenie:

sudo service2 httpd restart
Santos L. Victor
źródło
0

Uruchom następujące polecenie w git bash, które działa dobrze dla mnie

git config --global http.sslverify "false"
J4cK
źródło
0

To naprawiło dla mnie:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem
Reza Farshi
źródło
0

Poniżej opisz kroki, aby rozwiązać problemy.
1. Dowiedz się, że plik istnieje na zdefiniowanym adresie URL.
2. Jeśli nie, pobierz plik z adresu URL. https://curl.haxx.se/ca/cacert.pem
3. Skopiuj i zainfekuj plik do zdefiniowanej ścieżki w pliku php.ini.
4. Uruchom ponownie usługę Apache.

tapas talukder
źródło
0

Miałem ten problem i okazało się, że moja wersja CURL nie mogła parsować certyfikatów zakodowanych w DER (i nie zwracałam też uwagi na opcję --cert). Kiedy przekonwertowałem certyfikat do formatu PEM, zadziałało.

Joshua Davies
źródło
0

W moim przypadku /etc/ssl/certs/ca-certificates.crtbrak pliku. Jak się okazało, /etc/ssl/certspodczas tworzenia obrazu dokera usunąłem zawartość pliku Docker. Po dostosowaniu skryptów powłoki / poleceń bash uruchamianych z Dockerfile - curl działa teraz idealnie z nowego kontenera.

Tech Nomad
źródło