Bagaimana cara saya menangani sertifikat menggunakan cURL ketika mencoba mengakses url HTTPS?

188

Saya mendapatkan kesalahan berikut menggunakan curl:

curl: (77) pengaturan kesalahan sertifikat memverifikasi lokasi:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: tidak ada

Bagaimana cara saya mengatur lokasi verifikasi sertifikat ini? Terima kasih.

moorecats
sumber
2
OS / distro apa yang Anda pakai? Anda harus menginstal paket ca-sertifikat (itu namanya di debian / ubuntu).
igorw
40
Untuk referensi di masa mendatang, saya sudah ca-certificatesmenginstal tetapi kesalahan tetap ada. Masalahnya adalah sertifikat saya berada di /etc/ssl/certs/ca-certificates.crtbukan /etc/pki/tls/certs/ca-bundle.crt, jadi saya hanya perlu mengatur variabel lingkungan CURL_CA_BUNDLEke jalur yang benar.
Robert Smith
13
Keren! Ini bekerja untuk saya ketika saya mengatur export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
rapi

Jawaban:

83

Kesalahan ini terkait dengan paket yang hilang : ca-certificates. Pasang itu.

Di Ubuntu Linux (dan distro serupa):

# apt-get install ca-certificates

Dalam CygWin via Apt-Cyg

# apt-cyg install ca-certificates

Di Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

Dokumentasi tersebut memberi tahu:

Paket ini termasuk file PEM dari sertifikat CA untuk memungkinkan aplikasi berbasis SSL untuk memeriksa keaslian koneksi SSL.

Seperti yang terlihat di: Debian - Detail paket ca-sertifikat dalam pemerasan

Rubens Mariuzzo
sumber
97
ca-sertifikat sudah merupakan versi terbaru, namun saya masih mendapatkan kesalahan
Pastor Bones
2
Tentu saja, Anda akan mendapatkan kesalahan yang sama ini jika Anda mencoba menginstal apt-cyg melalui metode yang disarankan menggunakan curl dan raw.github.com .
10gistic
11
Di Arch Linux, Anda mungkin juga perlu pacman -S ca-certificates-utils. Aku melakukannya.
Mark Grimes
8
Paket ini sudah diinstal. Jawaban ini tidak membantu.
JimmyJames
9
@PastorBones Saya memiliki masalah yang sama bahwa paket itu sudah terbaru, saya pikir itu telah rusak sehingga sudo apt install --reinstall ca-certificatesmenginstal ulang paket dan menyelesaikan kesalahan yang saya lihat
Will
153

Saya juga telah menginstal versi terbaru dari ca-sertifikat tetapi masih mendapatkan kesalahan:

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

Masalahnya adalah bahwa curl mengharapkan sertifikat berada di jalur /etc/pki/tls/certs/ca-bundle.crttetapi tidak dapat menemukannya karena berada di jalur /etc/ssl/certs/ca-certificates.crt.

Menyalin sertifikat saya ke tujuan yang diharapkan dengan menjalankan

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

bekerja untukku. Anda harus membuat folder untuk tujuan target jika tidak ada dengan menjalankan

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

Jika perlu, modifikasi perintah di atas untuk membuat nama file tujuan sesuai dengan jalur yang diharapkan oleh curl, yaitu ganti /etc/pki/tls/certs/ca-bundle.crtdengan jalur berikut "CAfile:" di pesan kesalahan Anda.

Scott Emmons
sumber
31
Anda juga dapat membuat tautan simbolis dengan ln -sjika tidak ingin menyalinnya kembali setiap kali Anda memperbaruinya.
starbeamrainbowlabs
4
Punya masalah yang sama untuk rescuetimeaplikasi pada Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtmemecahkan masalah. ( CURL_CA_BUNDLEenv var tidak berfungsi)
GabLeRoux
Pada ubuntu saya ini tetap masalah: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Saya benar-benar mendapatkan The repository ... does not have a Release fileyang disebabkan oleh sertifikat yang hilang ( Could not load certificates from ...).
Marinos An
84

Masukkan ini ke dalam .bashrc

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

(lihat komentar dari Robert)

Yauhen Yakimovich
sumber
8
Terima kasih telah menyediakan metode yang tidak mengharuskan saya membuat file sistem dengan tangan, tetapi tetap menjaga keamanan menggunakan sertifikat!
Stephen Johnson
Terima kasih. Ini menyelesaikan masalah saya yang serupa dengan pyenv & curl. Saya menggunakan Ubuntu 14.04 dan sudah memiliki ca-sertifikat yang diinstal.
davidA
Pendekatan ini juga berfungsi dengan xonsh (tambahkan $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"ke .xonshrc).
m00am
Untuk berjaga-jaga: Versi satu liner ini:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew
30

Buat file ~/.curlrcdengan konten berikut

cacert=/etc/ssl/certs/ca-certificates.crt
prabeesh
sumber
1
jawaban terbaik, ini bekerja untuk saya di Linux Mint 17
Santiago
Di Mac, ia berhasil mengikuti in~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

Cara tercepat untuk mengatasi kesalahan ini adalah menambahkan opsi -k di suatu tempat di permintaan ikal Anda. Pilihan itu "memungkinkan koneksi ke kutipan SSL tanpa sertifikat." (dari curl --help)

Ketahuilah bahwa ini mungkin berarti bahwa Anda tidak berbicara dengan titik akhir seperti yang Anda pikirkan, karena mereka menunjukkan sertifikat yang tidak ditandatangani oleh CA yang Anda percayai.

Sebagai contoh:

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

memberi saya respons kesalahan berikut:

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

Saya menambahkan -k:

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

dan tidak ada pesan kesalahan. Sebagai bonus, sekarang saya telah menginstal apt-cyg. Dan ca-sertifikat.

10gistic
sumber
10
Itu mungkin mengatasi kesalahan, tetapi itu juga membuat koneksi "aman" menjadi tidak aman.
Tim
1
Tidak juga. Sejauh yang saya tahu, Anda tidak bisa hanya mem-bypass enkripsi koneksi aman, jadi itu masih terenkripsi dan hanya menuju satu titik akhir. Seseorang mengoreksi saya jika saya salah, tetapi satu-satunya risiko yang Anda jalankan adalah Anda bisa menjadi mangsa serangan pria-di-tengah. Masih tidak mungkin risiko jika Anda menggunakan ikal.
10gistic
18
Ya benar Opsi "-k" adalah singkatan untuk "--insecure". Jika Anda memiliki man-in-the-middle, apa yang menurut Anda dia lakukan dengan data Anda? Peringatan spoiler: dia mendekripsi, mencuri, dan mungkin memodifikasi dan menyuntikkan kembali ke aliran yang tidak aman. Langsung dari halaman manual: "-k, --insecure (SSL) Opsi ini secara eksplisit memungkinkan curl untuk melakukan koneksi dan transfer SSL" tidak aman. Semua koneksi SSL berusaha dibuat aman dengan menggunakan bundel sertifikat CA yang dipasang secara default. Ini membuat semua koneksi dianggap "tidak aman" gagal kecuali -k, --insecure digunakan. "
Tim
2
Jika Anda memerlukan SSL, Anda memerlukan privasi dan verifikasi - -kbenderanya berarti Anda kehilangan verifikasi. Tergantung pada kebutuhan Anda, ini mungkin dapat diterima. MITM adalah serangan non-sepele jika Anda menganggap jaringan Anda dan server yang berkomunikasi dengan Anda diamankan dari interlopers (dapatkah Anda membuat asumsi itu?). Risiko meningkat tergantung pada jenis data Anda (kode sumber dan sertifikat lebih berisiko daripada gambar). Anda dapat memverifikasi integritas data setelah transfer (checksum dll.) Tetapi sekarang Anda mengalihkan kepercayaan Anda ke saluran checksum itu. Pada akhirnya -kmemberi Anda sedikit lebih banyak pekerjaan.
Mark Fox
Jadi apakah itu berarti bahwa jika saya menggunakan sertifikat yang ditandatangani sendiri. Saya harus menggunakan opsi -k. Karena tidak mungkin memverifikasi sertifikat yang ditandatangani sendiri?
Linus
15

@roens benar. Ini mempengaruhi semua pengguna Anaconda , dengan kesalahan di bawah ini
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Solusinya adalah dengan menggunakan curl sistem default dan menghindari mengacaukan PATHvariabel Anaconda . Anda juga bisa

  1. Ganti nama biner Anaconda curl :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. ATAU hapus Anaconda curl
    conda remove curl

$ which curl /usr/bin/curl

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

Harsha Manjunath
sumber
Bagus, saya tidak menyadari Anaconda mencuri prioritas jalan saya. Ini berhasil setelah saya diganti curldengan jalur lengkap/usr/bin/curl
jxramos
Ini sangat membantu! Terima kasih.
Shababb Karim
12

Dari $ 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
sumber
7

Untuk kode PHP yang berjalan pada XAMPP pada Windows saya menemukan saya perlu mengedit php.ini untuk memasukkan di bawah ini

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

dan kemudian salin ke file https://curl.haxx.se/ca/cacert.pem dan ganti nama menjadi curl-ca-bundle.crt dan letakkan di bawah \ xampp path (saya tidak bisa membuat curl.capath bekerja) . Saya juga menemukan CAbundle di situs CURL tidak cukup untuk situs jarak jauh yang saya sambungkan, jadi digunakan yang terdaftar dengan Windows curl 7.47.1 versi pra-kompilasi di http://winampplugins.co.uk /keriting/

LJT
sumber
Di windows Anda juga bisa menambahkan "xampp" sebelum php seperti: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn
7

Saya memiliki masalah yang sama persis. Ternyata, /etc/ssl/certs/ca-certificates.crtfile saya salah. Entri terakhir menunjukkan sesuatu seperti ini:

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

Setelah menambahkan baris baru sebelumnya -----END CERTIFICATE-----, curl dapat menangani file sertifikat.

Ini sangat menjengkelkan untuk mencari tahu karena update-ca-certificatesperintah saya tidak memberi saya peringatan apa pun.

Ini mungkin atau mungkin bukan masalah curl versi khusus, jadi inilah versi saya, hanya untuk kelengkapan:

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 
Pemburu Udang
sumber
6

Ini berhasil untuk saya

sudo apt-get install ca-certificates

lalu masuk ke folder sertifikat di

sudo cd /etc/ssl/certs

kemudian Anda menyalin file ca-Certificate.crt ke dalam /etc/pki/tls/certs

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

jika tidak ada folder tls / certs: buat satu dan ubah izin menggunakan chmod 777 -R folderNAME

Kwame Yeboah
sumber
1
Saya mencoba ini tetapi ini tidak berhasil untuk saya dan saya masih mendapatkan kesalahan yang sama. Ada ide?
Anirudh
6

Alternatif lain untuk memperbaiki masalah ini adalah menonaktifkan validasi sertifikat:

echo insecure >> ~/.curlrc
Pablo R. Mier
sumber
1
Penanganan masalah, tetapi membantu saya setelah terlalu banyak waktu dengan sertifikat keriting. Terima kasih.
K. Gol
4

curl melakukan SSLverifikasi sertifikat secara default, menggunakan "bundel" Certificate Authority (CA)kunci publik (CA certs). Bundel default bernama curl-ca-bundle.crt; Anda dapat menentukan file alternatif menggunakan opsi --cacert.

Jika HTTPSserver ini menggunakan sertifikat yang ditandatangani oleh CA yang diwakili dalam bundel, verifikasi sertifikat mungkin gagal karena masalah dengan sertifikat (mungkin kedaluwarsa, atau nama itu mungkin tidak cocok dengan nama domain di URL).

Jika Anda ingin mematikan verifikasi curl tentang sertifikat, gunakan opsi -k (atau --insecure).

sebagai contoh

curl --insecure http://........
meda
sumber
3
Selain itu, "mempercayai sumber" sangat tidak relevan di sini, karena tanpa memvalidasi sertifikat dengan benar terhadap CA, Anda tidak tahu siapa "sumber" itu.
Jeff Allen
3

Cukup buat folder, yang hilang di sistem Anda ..

/ etc / pki / tls / certs /

dan buat file menggunakan perintah berikut,

sudo apt-get install ca-sertifikat

lalu salin dan tempel sertifikat ke folder tujuan, yang ditampilkan dalam kesalahan Anda .. milikku " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" pastikan Anda menempelkan file ke lokasi persis yang disebutkan dalam kesalahan. Gunakan perintah berikut untuk menyalin tempel ..

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

Tetap.

Manu RS
sumber
Tidak ada jawaban teratas yang bekerja untuk saya tetapi ini berhasil!
Prachiti Prakash Prabhu
2

Untuk apa nilainya, memeriksa which curlsedang dijalankan juga penting.

Seorang pengguna di mesin bersama yang saya kelola telah mendapatkan kesalahan ini. Tapi penyebabnya ternyata karena mereka menginstal Anaconda ( http://continuum.io ). Melakukan hal menempatkan jalur biner Anaconda sebelum standar $PATH, dan itu datang dengan sendiri curlbiner, yang memiliki kesulitan menemukan sertifikat default yang telah diinstal pada mesin Ubuntu ini.

ayam
sumber
1
Saya sarankan memeriksa which -a curluntuk melihat semua yang tersedia, dan tentu saja mencatat mana yang berada di atas.
jxramos
2

Jika ada yang masih kesulitan, coba ini, itu berhasil untuk saya. Hapus file di file Anda/etc/ssl/certs/ direktori lalu instal ulang ca-sertifikat:

sudo apt install ca-certificates --reinstall

Apakah ini ketika saya mencoba menginstal Linuxbrew.

Michael Enitan
sumber
1
Ini membantu saya tetapi saya tidak menghapus file di mesin saya. Cukup jalankan perintah sederhana dan ikal mulai bekerja.
Josefhu15
1

Jika Anda menggunakan homebrew di macOS atau linuxbrew di linux, coba instal ulang openssldan curldengan langkah-langkah berikut dari halaman ini .

Pesan kesalahan ini menunjukkan bahwa curl tidak dapat membuat koneksi yang aman menggunakan openssl. Instal ulang openssl harus memperbaiki masalah. Untuk sementara menggunakan koneksi tidak aman untuk curl dan git untuk mengunduh file yang diperlukan, jalankan:

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

Kemudian, instal atau instal ulang openssl dan curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Terakhir, batalkan perubahan keamanan untuk membuat curl dan git menggunakan koneksi aman lagi:

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

Anda mungkin perlu memulai sesi shell baru untuk memverifikasi hasilnya

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

Jika ini menunjukkan output berikut dalam output, masalahnya harus diselesaikan!

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

Referensi:

Itachi
sumber
Setelah berjam-jam mencoba. Ini menyelamatkan saya. Solusi yang tepat untuk makro akhirnya. Terima kasih banyak! :)
mrateb
1

Saya punya masalah yang sama: Saya sedang membangun gambar buruh pelabuhan berbasis alpine, dan ketika saya ingin meringkuk ke situs web organisasi saya, kesalahan ini muncul. Untuk mengatasinya, saya harus mendapatkan sertifikat CA dari perusahaan saya, kemudian, saya harus menambahkannya ke sertifikat CA dari gambar saya.

Dapatkan sertifikat CA

Gunakan OpenSSL untuk mendapatkan sertifikat yang terkait dengan situs web:

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

Ini akan menampilkan sesuatu seperti:

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

Dapatkan sertifikat terakhir (konten antara -----BEGIN CERTIFICATE-----dan
-----END CERTIFICATE-----markup disertakan) dan simpan ke dalam file (mycompanyRootCA.crt misalnya)

Bangun citra Anda

Kemudian, ketika Anda akan membuat gambar buruh pelabuhan dari alpine, lakukan hal berikut:

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

Gambar Anda sekarang akan berfungsi dengan baik! \Hai/

alfabet
sumber
1

Temukan saja solusi ini berfungsi dengan baik untuk saya.

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

Saya menemukan solusi ini dari sini

Daniel
sumber
0

Kesalahan ini disebabkan oleh file sertifikat rantai SSL yang rusak atau hilang di direktori PKI. Anda harus memastikan file ca-bundle, langkah-langkah berikut: Di konsol / terminal Anda:

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

Masukkan situs ini: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , dapatkan sertifikat-ca Anda, untuk SO. Salin url unduhan dan tempel di url: wget your_url_donwload_ca-ceritificated.rpm sekarang, instal rpm Anda:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

sekarang restart layanan Anda: contoh saya perintah ini:

sudo service2 httpd restart
Santos L. Victor
sumber
0

Jalankan perintah berikut di git bash yang berfungsi dengan baik untuk saya

git config --global http.sslverify "false"
J4cK
sumber
0

Ini diperbaiki untuk saya:

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

Di bawah ini jelaskan langkah-langkah untuk memperbaiki masalah tersebut.
1. Cari tahu file tersebut ada di url define.
2. Jika tidak maka unduh file dari url. https://curl.haxx.se/ca/cacert.pem
3. Salin dan hama file ke jalur yang ditentukan pada file php.ini.
4. Mulai ulang layanan apache.

tapas talukder
sumber
0

Saya punya masalah ini dan ternyata versi CURL saya tidak dapat menguraikan sertifikat DER-disandikan (dan juga tidak memperhatikan opsi --cert-type). Ketika saya mengonversi sertifikat ke format PEM, itu berhasil.

Joshua Davies
sumber
0

Dalam kasus saya, /etc/ssl/certs/ca-certificates.crtfile tersebut hilang. Karena ternyata saya telah menghapus konten /etc/ssl/certsdari dalam Dockerfile ketika membangun gambar buruh pelabuhan. Setelah menyesuaikan skrip shell saya / perintah bash dijalankan dari dalam Dockerfile - curl berfungsi sempurna dari dalam wadah baru.

Tek Nomad
sumber