Bir HTTPS URL'sine erişmeye çalışırken cURL kullanan sertifikalarla nasıl başa çıkabilirim?


188

Curl kullanarak aşağıdaki hatayı alıyorum:

curl: (77) sertifika doğrulama konumlarını belirlerken hata:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CAyolu: yok

Bu sertifika doğrulama konumlarını nasıl ayarlarım? Teşekkürler.


2
Hangi işletim sistemi / dağıtımdasınız? Ca-certificate paketini kurmalısınız (debian / ubuntu'da buna denir).
igorw

40
Gelecekte başvurmak için zaten ca-certificatesyükledim ancak hata devam etti. Sorun sertifikalarımın /etc/ssl/certs/ca-certificates.crtyerine yerleştirilmiş olmasıydı /etc/pki/tls/certs/ca-bundle.crt, bu yüzden çevresel değişkeni CURL_CA_BUNDLEdoğru yola ayarlamak zorunda kaldım .
Robert Smith

13
Güzel! Ayarladığımda benim için çalışıyor export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
düzenli

Yanıtlar:


83

Bu hata bir ilişkilidir eksik paketin : ca-certificates. Yükle.

Ubuntu Linux'ta (ve benzeri dağıtımlarda):

# apt-get install ca-certificates

Apt-Cyg aracılığıyla CygWin'de

# apt-cyg install ca-certificates

Arch Linux'ta (Raspberry Pi)

# pacman -S ca-certificates

Belgeler şunları söylüyor:

Bu pakette, SSL tabanlı uygulamaların SSL bağlantılarının gerçekliğini kontrol etmesine izin vermek için CA sertifikalarının PEM dosyaları bulunur.

Görüldüğü gibi: Debian - ca-sertifika paketinin squeeze içerisinde ayrıntıları


97
ca-sertifikalar zaten en yeni sürüm, ama yine de hatayı alıyorum
Pastor Bones

2
Elbette, apt-cyg'yi curl ve raw.github.com kullanarak önerilen yöntemle yüklemeye çalışırsanız aynı hatayı alırsınız .
lojistik

11
Arch Linux'ta da ihtiyacınız olabilir pacman -S ca-certificates-utils. Yaptım.
Mark Grimes

8
Bu paket zaten kurulu. Bu cevap yardımcı olmuyor.
JimmyJames

9
@PastorBones Ben paketi zaten en son aynı sorun vardı, ancak sudo apt install --reinstall ca-certificatespaket yeniden yüklendi ve gördüğüm hataları çözdü ancak bozuk olduğunu düşünüyorum
Will

153

Ayrıca yüklü ca-sertifikaların en yeni sürümü vardı ama hala hatayı alıyordum:

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

Sorun, kıvrımın sertifikanın yolda olmasını beklediği, /etc/pki/tls/certs/ca-bundle.crtancak yolda olduğu için bulamadığıydı /etc/ssl/certs/ca-certificates.crt.

Sertifikamı çalıştırarak beklenen hedefe kopyalama

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

benim için çalıştı. Hedef olarak çalıştırarak yoksa, hedef hedef için klasör oluşturmanız gerekir.

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

Gerekirse, hedef dosya adını curl tarafından beklenen yolla eşleştirmek için yukarıdaki komutu değiştirin, yani /etc/pki/tls/certs/ca-bundle.crthata iletinizde "CAfile:" ifadesini izleyen yolla değiştirin .


31
Ayrıca ln -sher güncellemenizde yeniden kopyalamak istemiyorsanız, ile sembolik bir bağlantı oluşturabilirsiniz .
starbeamrainbowlabs

4
rescuetimeFedora 25 üzerinde uygulama için aynı sorun vardı sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt. ( CURL_CA_BUNDLEenv var işe yaramadı)
GabLeRoux

Benim ubuntu üzerinde bu sorunu düzeltildi: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Aslında The repository ... does not have a Release fileeksik sertifika ( Could not load certificates from ...) neden oldu alıyordum .
Marinos

84

Bunu içine koy .bashrc

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

(Robert'ın yorumuna bakınız)


8
Sistem dosyalarını elle almamı gerektirmeyen, ancak yine de sertifika kullanma güvenliğini koruyan bir yöntem sağladığınız için teşekkür ederiz!
Stephen Johnson

Teşekkür ederim. Bu pyenv & curl ile benzer sorunumu çözdü. Ubuntu 14.04 kullanıyordum ve zaten yüklü ca-sertifikaları vardı.
davidA

Bu yaklaşım aynı zamanda xonsh (ekleme ile çalışır $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"için .xonshrc).
m00am

Her ihtimale karşı: Bunun bir liner versiyonu:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew

30

~/.curlrcAşağıdaki içeriğe sahip bir dosya oluşturun

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

1
en iyi cevap, bu benim için Linux Mint 17'de çalıştı
Santiago

Mac'te, şu şekilde çalıştı~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

21

Hatayı çözmenin en hızlı yolu, curl isteğinizde bir yerde -k seçeneğine eklemektir. Bu seçenek "sertifikasız SSL alıntılarına bağlantı yapılmasına izin verir." (curl --help'ten)

Bunun, güvendiğiniz bir CA tarafından imzalanmamış bir sertifika sundukları için, düşündüğünüz uç nokta ile konuşmamanız gerektiği anlamına gelebileceğini unutmayın.

Örneğin:

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

bana aşağıdaki hata yanıtını verdi:

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

-K üzerine ekledim:

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

ve hata mesajı yok. Bonus olarak, şimdi apt-cyg yükledim. Ve ca sertifikaları.


10
Bu hatanın üstesinden gelebilir, ancak "güvenli" bağlantıyı güvensiz hale getirir.
Tim

1
Pek sayılmaz. Bildiğim kadarıyla, güvenli bir bağlantının şifrelemesini atlayamazsınız, bu yüzden hala şifrelenir ve sadece bir uç noktaya gider. Birisi yanılıyorsam beni düzeltir, ama koşma riskiniz ortadaki adam saldırısına karşı avlanabilmenizdir. Kıvrılma kullanıyorsanız hala bir risk yoktur.
lojistik

18
Evet gerçekten. "-K" seçeneği "--insecure" kısaltmasıdır. Ortadaki adamınız varsa, verilerinizle ne yaptığını düşünüyorsunuz? Spoiler uyarısı: şifresini çözüyor, çalıyor ve muhtemelen değiştiriyor ve güvensiz akışa geri enjekte ediyor. Doğrudan man sayfasından: "-k, --insecure (SSL) Bu seçenek açıkça, curl'un" güvensiz "SSL bağlantıları ve aktarımları yapmasına izin verir. Tüm SSL bağlantıları, varsayılan olarak yüklenen CA sertifika paketi kullanılarak güvenli hale getirilmeye çalışılır. Bu, -k, --insecure kullanılmadığı sürece "güvensiz" kabul edilen tüm bağlantıların başarısız olmasını sağlar.
Tim

2
SSL'ye ihtiyacınız varsa gizlilik ve doğrulamaya ihtiyacınız vardır - -kbayrak, doğrulamayı kaybettiğiniz anlamına gelir . İhtiyaçlarınıza bağlı olarak bu kabul edilebilir. Ağınızın ve iletişim kurduğunuz sunucunun interloper'lardan korunduğunu varsayarsanız, MITM önemsiz saldırılardır (bu varsayımı yapabilir misiniz?). Risk, verilerinizin türüne bağlı olarak artar (kaynak kodu ve sertifikalar görüntülerden daha risklidir). Aktarımdan sonra verilerin bütünlüğünü doğrulayabilirsiniz (sağlama toplamları vb.), Ancak artık güveninizi bu sağlama toplamı kanalına kaydırıyorsunuz. Sonunda -ksize biraz daha fazla iş verir.
Mark Fox

Yani bu Kendinden imzalı bir sertifika kullanıyorsanız anlamına gelir. -K seçeneğini kullanmalıyım. Kendinden imzalı sertifikayı doğrulamak mümkün olmayabileceğinden?
Linus

15

@roens doğru. Bu , aşağıdaki Anaconda kullanıcılarını etkiler , aşağıdaki hata ile
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Çözüm, varsayılan sistem kıvrımını kullanmak ve ekli Anaconda değişkeniyle uğraşmaktan kaçınmaktırPATH . Ya sen

  1. Anaconda curl ikili dosyasını yeniden adlandırın :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. VEYA Anaconda kıvrılmasını kaldır
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu kıvırmak Github sorunu https://github.com/conda/conda-recipes/issues/352


İyi bul, Anaconda'nın yol önceliğimi çaldığını fark etmedim. curlTam yolla değiştirdiğimde işe yaradı/usr/bin/curl
jxramos

Bu çok yardımcı oldu! Teşekkürler.
Shababb Karim

12

Gönderen $ 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

Windows üzerinde XAMPP üzerinde çalışan PHP kodu için ben aşağıdakileri içerecek şekilde php.ini düzenlemek gerekiyordu bulundu

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

ve sonra https://curl.haxx.se/ca/cacert.pem bir dosyaya kopyalayın ve curl-ca-bundle.crt olarak yeniden adlandırın ve \ xampp yolunun altına yerleştirin (curl.capath'i çalıştıramadım) . Ayrıca cURL sitesindeki CAbundle'ın bağlandığım uzak site için yeterli olmadığını buldum, bu yüzden http://winampplugins.co.uk adresinde 7.47.1 kıvrımının önceden derlenmiş bir Windows sürümü ile listelenen bir site kullandım / bükme /


Windows'da php'den önce "xampp" ifadesini de şu şekilde ekleyebilirsiniz: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn

7

Ben de aynı problemi yaşadım. Sonradan anlaşıldı ki, benim /etc/ssl/certs/ca-certificates.crtdosya biçimi bozuk edildi. Son giriş böyle bir şey gösterdi:

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

Daha önce bir satırsonu ekledikten sonra -----END CERTIFICATE-----, curl sertifika dosyasını işleyebildi.

Komutum update-ca-certificatesbana herhangi bir uyarı vermediği için bunu öğrenmek çok can sıkıcıydı.

Bu, curl'un sürüme özgü bir sorunu olabilir veya olmayabilir, bu yüzden benim sürümüm, tamlık için:

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

Bu benim için çalıştı

sudo apt-get install ca-certificates

sonra adresindeki sertifikalar klasörüne gidin

sudo cd /etc/ssl/certs

sonra ca-certificate.crt dosyasını /etc/pki/tls/certs

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

tls / certs klasörü yoksa: bir tane oluşturun ve chmod 777 -R klasörünü kullanarak izinleri değiştirin


1
Bunu denedim ama bu benim için işe yaramadı ve hala aynı hatayı alıyorum. Herhangi bir fikir ?
Anirudh

6

Bu sorunu düzeltmenin başka bir alternatifi, sertifika doğrulamasını devre dışı bırakmaktır:

echo insecure >> ~/.curlrc

1
Geçici çözüm, ancak kıvrılma sertifikaları ile çok fazla zaman sonra bana yardımcı olur. Teşekkürler.
K. Gol

4

curl SSL, Certificate Authority (CA)genel anahtarların (CA sertifikaları) "paketini" kullanarak varsayılan olarak sertifika doğrulaması yapar . Varsayılan paket, curl-ca-bundle.crt olarak adlandırılır; --cacert seçeneğini kullanarak alternatif bir dosya belirleyebilirsiniz.

Bu HTTPSsunucu pakette temsil edilen bir CA tarafından imzalanmış bir sertifika kullanıyorsa, sertifika doğrulaması muhtemelen sertifikadaki bir sorun nedeniyle başarısız olabilir (süresi dolmuş olabilir veya ad URL'deki alan adıyla eşleşmeyebilir).

Curl'un sertifika doğrulamasını kapatmak istiyorsanız -k (veya --insecure) seçeneğini kullanın.

Örneğin

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

3
Belgeyi bir CA'ya karşı doğru bir şekilde doğrulamaksızın, "kaynağın" kim olduğu hakkında hiçbir fikriniz olmadığı için, "kaynağa güvenmek" in burada bir önemi yoktur.
Jeff Allen


3

Sadece sisteminizde eksik olan klasörleri oluşturun.

/ Etc / aaa / TLS / certs /

ve aşağıdaki komutu kullanarak dosyayı oluşturun,

sudo apt-get install ca-sertifikaları

ve ardından sertifikayı kopyalayıp hatanızda gösterilen hedef klasöre yapıştırın .. benimki " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" dosyayı hatada belirtilen konuma yapıştırdığınızdan emin olun. Yapıştır kopyalamak için aşağıdaki komutu kullanın.

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

Sabit.


En iyi cevapların hiçbiri benim için çalışmadı ama bu işe yaradı!
Prachiti Prakash Prabhu

2

Değer için, kontrol which curledilmesi de önemlidir.

Paylaştığım paylaşılan bir makinedeki bir kullanıcı bu hatayı alıyordu. Ancak bunun nedeni Anaconda'yı ( http://continuum.io ) kurdukları için ortaya çıktı . Aksi takdirde standart önce anaconda ikili yolunu koymak $PATHve kendi ile gelir curlvarsayılan certs bulmakta sorun vardı ikili, edildi , bu Ubuntu makinede yüklü.


1
which -a curlMevcut her şeyi görmek için kontrol etmenizi ve hangisinin zirveye geldiğini belirtmenizi öneririm .
18:23

2

Birisi hala sorun yaşıyorsa, bunu deneyin, benim için çalıştı. Dizininizdeki dosyaları silin ve /etc/ssl/certs/ca-sertifikaları yeniden yükleyin:

sudo apt install ca-certificates --reinstall

Linuxbrew'u yüklemeyi denediğimde bunu yaptım.


1
Bu bana yardımcı oldu ama makinemdeki dosyaları silmedim. Sadece basit komutu çalıştırdı ve curl çalışmaya başladı.
Josefhu15

1

MacOS'ta homebrew veya linux'da linuxbrew kullanıyorsanız, opensslve bu sayfadakicurl aşağıdaki adımlarla yeniden yüklemeyi deneyin .

Bu hata iletisi, curl'un openssl kullanarak güvenli bir bağlantı kuramadığını gösterir. Openssl dosyasının yeniden yüklenmesi sorunu çözmelidir. Gerekli dosyaları indirmek için hem curl hem de git için güvenli olmayan bir bağlantıdan geçici olarak yararlanmak için şunu çalıştırın:

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

Ardından, openssl'yi ve curl'u kurun veya yeniden yükleyin:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Son olarak, curl ve git güvenli bağlantılarını tekrar kullanmak için güvenlik değişikliklerini geri alın:

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

Sonucu şununla doğrulamak için yeni bir kabuk oturumu başlatmanız gerekebilir

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

Çıktıda aşağıdaki çıktıyı gösteriyorsa, sorun çözülmelidir!

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

Referanslar:


Saatlerce denedikten sonra. Bu beni kurtardı. Sonunda macos için doğru çözüm. Çok teşekkürler! :)
19'da mrateb

1

Aynı sorunu yaşıyorum: Alp tabanlı bir docker görüntüsü oluşturuyorum ve kuruluşumun bir web sitesine kıvrılmak istediğimde bu hata görünüyor. Bunu çözmek için şirketimin CA sertifikasını almam gerekiyor, o zaman görüntümün CA sertifikalarına eklemeliyim.

CA sertifikasını alın

Web sitesi ile ilgili sertifikaları almak için OpenSSL kullanın:

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

Bu şöyle bir şey çıkarır:

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

Son sertifikayı ( -----BEGIN CERTIFICATE-----ve
-----END CERTIFICATE-----işaretlemeler arasındaki içerik ) alın ve bir dosyaya kaydedin (örneğin mycompanyRootCA.crt)

Resminizi oluşturun

Ardından, docker resminizi alpten oluşturduğunuzda şunları yapın:

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

Resminiz şimdi düzgün bir şekilde çalışacak! \Ö/


1

Sadece bu çözümün benim için mükemmel çalıştığını bulun.

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

Bu çözümü buradan buldum


0

Hata, PKI dizinindeki bozuk veya eksik SSL zinciri sertifika dosyalarından kaynaklanmaktadır. Aşağıdaki adımları uygulayarak dosyaların ca-bundle olduğundan emin olmanız gerekir: Konsolunuzda / terminalinizde:

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

Bu siteyi girin: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , SO sertifikanızı alın. İndirme URL'sini kopyalayın ve URL'ye yapıştırın: w_url_donwload_ca-ceritificated.rpm'yi şimdi yükleyin, rpm'nizi yükleyin:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

şimdi hizmetinizi yeniden başlatın: benim örneğim bu komut:

sudo service2 httpd restart

0

Git bash benim için iyi çalışıyor aşağıdaki komutu çalıştırın

git config --global http.sslverify "false"

0

Bu benim için düzeltildi:

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


0

Körük, sorunları çözme adımlarını açıklar.
1. Tanımlama url'sinde dosyanın var olduğunu öğrenin.
2. Değilse, dosyayı url'den indirin. https://curl.haxx.se/ca/cacert.pem
3. Dosyayı php.ini dosyasında tanımlı yola kopyalayın ve zararlılara zarar verin.
4. Apache hizmetini yeniden başlatın.


0

Bu sorun vardı ve CURL sürümüm DER kodlu sertifikaları ayrıştı olamazdı ortaya çıktı (ve --cert-type seçeneği de dikkat değildi). Sertifikayı PEM formatına dönüştürdüğümde işe yaradı.


0

Benim durumumda /etc/ssl/certs/ca-certificates.crtdosya eksikti. /etc/ssl/certsAnlaşıldığı gibi docker görüntüsünü oluştururken Dockerfile içindeki içeriği sildim . Dockerfile - curl içinden çalıştırılan kabuk komut dosyalarımı / bash komutlarımı ayarladıktan sonra yeni kapsayıcıdan mükemmel çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.