Comment gérer les certificats à l'aide de cURL tout en essayant d'accéder à une URL HTTPS?

188

J'obtiens l'erreur suivante en utilisant curl:

curl: (77) erreur de configuration du certificat vérifier les emplacements:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: aucun

Comment définir les emplacements de vérification de ce certificat? Merci.

moorecats
la source
2
Sur quel OS / distribution êtes-vous? Vous devez installer le package ca-certificates (c'est ce qu'il appelle sur debian / ubuntu).
igorw
40
Pour référence future, j'avais déjà ca-certificatesinstallé mais l'erreur a persisté. Le problème était que mes certificats étaient situés au /etc/ssl/certs/ca-certificates.crtlieu de /etc/pki/tls/certs/ca-bundle.crt, donc je devais simplement définir la variable d'environnement CURL_CA_BUNDLEsur le chemin correct.
Robert Smith
13
Cool! Cela fonctionne pour moi quand je me fixe export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
tidy

Réponses:

83

Cette erreur est liée à un paquet manquant : ca-certificates. Installez-le.

Dans Ubuntu Linux (et distribution similaire):

# apt-get install ca-certificates

Dans CygWin via Apt-Cyg

# apt-cyg install ca-certificates

Dans Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

La documentation dit:

Ce package comprend des fichiers PEM de certificats CA pour permettre aux applications basées sur SSL de vérifier l'authenticité des connexions SSL.

Comme vu à: Debian - Détails du paquet ca-certificates dans squeeze

Rubens Mariuzzo
la source
97
ca-certificate est déjà la version la plus récente, mais je reçois toujours l'erreur
Pastor Bones
2
Bien sûr, vous obtiendrez la même erreur si vous essayez d'installer apt-cyg via la méthode recommandée en utilisant curl et raw.github.com .
10gistic
11
Sur Arch Linux, vous pourriez également avoir besoin de pacman -S ca-certificates-utils. J'ai fait.
Mark Grimes
8
Ce package est déjà installé. Cette réponse n'est pas utile.
JimmyJames
9
@PastorBones J'ai eu le même problème que le paquet était déjà le plus récent, je pense qu'il avait cependant été corrompu, alors j'ai sudo apt install --reinstall ca-certificatesréinstallé le paquet et résolu les erreurs que je voyais
Sera
153

J'avais également installé la dernière version des certificats ca mais je recevais toujours l'erreur:

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

Le problème était que curl s'attendait à ce que le certificat se trouve sur le chemin, /etc/pki/tls/certs/ca-bundle.crtmais ne pouvait pas le trouver car il était sur le chemin /etc/ssl/certs/ca-certificates.crt.

Copier mon certificat vers la destination attendue en exécutant

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

travaillé pour moi. Vous devrez créer des dossiers pour la destination cible s'ils n'existent pas en exécutant

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

Si nécessaire, modifiez la commande ci-dessus pour que le nom du fichier de destination corresponde au chemin attendu par curl, c'est-à-dire remplacez-le /etc/pki/tls/certs/ca-bundle.crtpar le chemin suivant "CAfile:" dans votre message d'erreur.

Scott Emmons
la source
31
Vous pouvez également créer un lien symbolique avec ln -ssi vous ne souhaitez pas le recopier à chaque fois que vous le mettez à jour.
starbeamrainbowlabs
4
J'ai eu le même problème pour l' rescuetimeapplication sur Fedora 25. a sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtrésolu le problème. ( CURL_CA_BUNDLEenv var n'a pas fonctionné)
GabLeRoux
Sur mon ubuntu ce soit réglé la question: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. J'obtenais en fait ce The repository ... does not have a Release filequi était causé par un certificat manquant ( Could not load certificates from ...).
Marinos An
84

Mettez ceci dans votre .bashrc

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

(voir commentaire de Robert)

Yauhen Yakimovich
la source
8
Merci de fournir une méthode qui ne m'oblige pas à nettoyer les fichiers système à la main, mais qui garde toujours la sécurité de l'utilisation des certificats!
Stephen Johnson
Je vous remercie. Cela a résolu mon problème similaire avec pyenv & curl. J'utilisais Ubuntu 14.04 et j'avais déjà installé des certificats ca.
davidA
Cette approche fonctionne également avec xonsh (ajouter $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"à la .xonshrc).
m00am
Juste au cas où: La version unique de ceci:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew
30

Créez un fichier ~/.curlrcavec le contenu suivant

cacert=/etc/ssl/certs/ca-certificates.crt
prabeesh
la source
1
la meilleure réponse, cela a fonctionné pour moi sur Linux Mint 17
Santiago
Sur Mac, cela a fonctionné avec le suivant dans~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

Le moyen le plus rapide de contourner l'erreur est d'ajouter l'option -k quelque part dans votre requête curl. Cette option "autorise les connexions aux cites SSL sans certificats". (de curl --help)

Sachez que cela peut signifier que vous ne parlez pas au point de terminaison que vous pensez être, car il présente un certificat non signé par une autorité de certification de confiance.

Par exemple:

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

m'a donné la réponse d'erreur suivante:

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

J'ai ajouté sur -k:

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

et aucun message d'erreur. En prime, j'ai maintenant apt-cyg installé. Et ca-certificats.

10gistique
la source
10
Cela peut contourner l'erreur, mais cela rend également la connexion "sécurisée" non sécurisée.
Tim
1
Pas vraiment. Pour autant que je sache, vous ne pouvez pas contourner le cryptage d'une connexion sécurisée, elle est donc toujours cryptée et ne va qu'à un seul point de terminaison. Quelqu'un me corrige si je me trompe, mais le seul risque que vous courez est que vous pourriez être la proie d'une attaque d'homme du milieu. Ce n'est toujours pas un risque si vous utilisez curl.
10gistic
18
Oui vraiment. L'option "-k" est un raccourci pour "--insecure". Si vous avez un homme au milieu, que pensez-vous qu'il fait de vos données? Alerte spoiler: il le déchiffre, le vole et peut-être le modifie et le réinjecte dans le flux non sécurisé. Directement depuis la page de manuel: "-k, --insecure (SSL) Cette option autorise explicitement curl à effectuer des connexions et des transferts SSL" non sécurisés ". Toutes les connexions SSL sont tentées d'être sécurisées en utilisant le bundle de certificats CA installé par défaut. Cela fait échouer toutes les connexions considérées comme «non sécurisées» à moins que -k, --insecure ne soit utilisé.
Tim
2
Si vous avez besoin de SSL, vous avez besoin de confidentialité et de vérification - le -kdrapeau signifie que vous perdez la vérification. Selon vos besoins, cela peut être acceptable. Les MITM sont des attaques non triviales si vous supposez que votre réseau et le serveur avec lequel vous communiquez sont protégés contre les intrus (pouvez-vous faire cette hypothèse?). Le risque augmente en fonction du type de vos données (le code source et les certificats sont plus risqués que les images). Vous pouvez vérifier l'intégrité des données après le transfert (sommes de contrôle, etc.), mais maintenant vous transférez votre confiance sur ce canal de somme de contrôle. En fin de compte, -kvous obtenez un peu plus de travail.
Mark Fox
Cela signifie-t-il que si j'utilise un certificat auto-signé. Je devrais utiliser l'option -k. Comme il n'est peut-être pas possible de vérifier le certificat auto-signé?
Linus
15

@roens a raison. Cela affecte tous les utilisateurs d' Anaconda , avec l'erreur ci-dessous
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

La solution de contournement consiste à utiliser la boucle système par défaut et à éviter de jouer avec la PATHvariable Anaconda pré-ajoutée . Tu peux soit

  1. Renommez le binaire Anaconda curl :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. OU supprimer Anaconda curl
    conda remove curl

$ which curl /usr/bin/curl

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

Harsha Manjunath
la source
Bonne trouvaille, je n'avais pas réalisé qu'Anaconda volait ma priorité de chemin. Cela a fonctionné une fois que j'ai remplacé curlpar le chemin complet/usr/bin/curl
jxramos
Cela a beaucoup aidé! Merci.
Shababb Karim
12

De $ 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
la source
7

Pour le code PHP fonctionnant sur XAMPP sous Windows, j'ai trouvé que je devais modifier php.ini pour inclure ce qui suit

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

puis copiez dans un fichier https://curl.haxx.se/ca/cacert.pem et renommez-le en curl-ca-bundle.crt et placez-le sous \ xampp path (je n'ai pas pu faire fonctionner curl.capath) . J'ai également trouvé que le CAbundle sur le site cURL n'était pas suffisant pour le site distant auquel je me connectais, alors j'en ai utilisé un qui est répertorié avec une version Windows pré-compilée de curl 7.47.1 à http://winampplugins.co.uk /boucle/

LJT
la source
Sur Windows, vous pouvez également simplement ajouter "xampp" avant php comme ceci: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn
7

J'ai eu exactement le même problème. En fait, mon /etc/ssl/certs/ca-certificates.crtfichier était mal formé. La dernière entrée montrait quelque chose comme ceci:

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

Après avoir ajouté une nouvelle ligne auparavant -----END CERTIFICATE-----, curl était capable de gérer le fichier de certificats.

C'était très ennuyeux à découvrir car mon update-ca-certificatescommandement ne m'a donné aucun avertissement.

Cela peut ou non être un problème spécifique à la version de curl, voici donc ma version, juste pour être complète:

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 
CrevettePhaser
la source
6

Cela a fonctionné pour moi

sudo apt-get install ca-certificates

puis allez dans le dossier des certificats à

sudo cd /etc/ssl/certs

puis copiez le fichier ca-certificates.crt dans le /etc/pki/tls/certs

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

s'il n'y a pas de dossier tls / certs: créez-en un et modifiez les permissions à l'aide de chmod 777 -R folderNAME

Kwame Yeboah
la source
1
J'ai essayé cela mais cela n'a pas fonctionné pour moi et j'obtiens toujours la même erreur. Des idées ?
Anirudh
6

Une autre alternative pour résoudre ce problème consiste à désactiver la validation du certificat:

echo insecure >> ~/.curlrc
Pablo R. Mier
la source
1
Solution de contournement, mais cela m'aide après trop de temps avec les certificats curl. Merci.
K. Gol
4

curl effectue la SSLvérification des certificats par défaut, en utilisant un "bundle" deCertificate Authority (CA) clés publiques (certificats CA). Le bundle par défaut est nommé curl-ca-bundle.crt; vous pouvez spécifier un autre fichier à l'aide de l'option --cacert.

Si ce HTTPSserveur utilise un certificat signé par une autorité de certification représentée dans le bundle, la vérification du certificat a probablement échoué en raison d'un problème avec le certificat (il a peut-être expiré ou le nom peut ne pas correspondre au nom de domaine dans l'URL).

Si vous souhaitez désactiver la vérification du certificat par curl, utilisez l' --insecureoption -k (ou ).

par exemple

curl --insecure http://........
meda
la source
3
Juste un aparté que "faire confiance à la source" est assez hors de propos ici, car sans valider correctement le certificat par rapport à une autorité de certification, vous n'avez aucune idée de qui est "la source".
Jeff Allen
4

Il semble que votre curl pointe vers un fichier non existant avec des certificats CA ou similaire.

Pour la référence principale sur les certificats d'autorité de certification avec curl, voir: https://curl.haxx.se/docs/sslcerts.html

Daniel Stenberg
la source
3

Créez simplement les dossiers manquants dans votre système.

/ etc / pki / tls / certs /

et créez le fichier à l'aide de la commande suivante,

sudo apt-get install certificats ca

puis copiez et collez le certificat dans le dossier de destination, qui s'affiche dans votre erreur .. le mien était " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" assurez-vous de coller le fichier à l'emplacement exact mentionné dans l'erreur. Utilisez la commande suivante pour copier-coller.

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

Fixé.

Manu RS
la source
Aucune des meilleures réponses n'a fonctionné pour moi, mais cela a fonctionné!
Prachiti Prakash Prabhu le
2

Pour ce que ça vaut, la vérification which curlest en cours d'exécution est également importante.

Un utilisateur sur une machine partagée que je gère avait reçu cette erreur. Mais la cause s'est avérée être parce qu'ils avaient installé Anaconda ( http://continuum.io ). Ce faisant, mettre chemin binaire Anaconda avant que la norme $PATH, et il est livré avec son propre curlbinaire, qui avait du mal à trouver les certs par défaut qui ont été installés sur cette machine Ubuntu.

Roens
la source
1
Je recommande de vérifier which -a curlpour voir tout ce qui est disponible, et bien sûr de noter lequel vient en tête.
jxramos
2

Si quelqu'un a encore des problèmes, essayez ceci, cela a fonctionné pour moi. Supprimez les fichiers de votre /etc/ssl/certs/répertoire puis réinstallez les certificats ca:

sudo apt install ca-certificates --reinstall

Je l'ai fait quand j'ai essayé d'installer Linuxbrew.

Michael Enitan
la source
1
Cela m'a aidé mais je n'ai pas supprimé les fichiers sur ma machine. Il suffit d'exécuter la commande simple et curl a commencé à fonctionner.
Josefhu15
1

Si vous utilisez homebrew sur macOS ou linuxbrew sous Linux, essayez de réinstaller le opensslet curlen suivant les étapes suivantes à partir de cette page .

Ce message d'erreur indique que curl n'est pas en mesure d'établir une connexion sécurisée à l'aide d'openssl. Une réinstallation d'openssl devrait résoudre le problème. Pour utiliser temporairement une connexion non sécurisée pour curl et git afin de télécharger les fichiers nécessaires, exécutez:

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

Ensuite, installez ou réinstallez openssl et curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Enfin, annulez les modifications de sécurité pour que curl et git utilisent à nouveau des connexions sécurisées:

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

Vous devrez peut-être démarrer une nouvelle session shell pour vérifier le résultat avec

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

S'il affiche la sortie suivante en sortie, le problème devrait être résolu!

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

Références:

Itachi
la source
Après des heures d'essais. Cela m'a sauvé. La bonne solution pour macos enfin. Merci beaucoup! :)
mrateb
1

J'ai le même problème: je crée une image docker alpine, et lorsque je souhaite accéder à un site Web de mon organisation, cette erreur apparaît. Pour le résoudre, je dois obtenir le certificat CA de mon entreprise, puis je dois l'ajouter aux certificats CA de mon image.

Obtenez le certificat CA

Utilisez OpenSSL pour obtenir les certificats liés au site Web:

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

Cela affichera quelque chose comme:

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

Obtenez le dernier certificat (le contenu entre le -----BEGIN CERTIFICATE-----et les
-----END CERTIFICATE-----balises incluses) et enregistrez-le dans un fichier (mycompanyRootCA.crt par exemple)

Construisez votre image

Ensuite, lorsque vous construirez votre image docker à partir d'alpin, procédez comme suit:

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

Votre image fonctionnera désormais correctement! \ o /

alphayax
la source
1

Trouvez simplement que cette solution fonctionne parfaitement pour moi.

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

J'ai trouvé cette solution d' ici

Daniel
la source
0

L'erreur est due à des fichiers de certificat de chaîne SSL corrompus ou manquants dans le répertoire PKI. Vous devrez vous assurer que les fichiers peuvent être regroupés en suivant les étapes suivantes: Dans votre console / terminal:

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

Entrez sur ce site: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , obtenez votre certificat CA, pour SO. Copiez l'url de téléchargement et collez-la dans l'url: wget your_url_donwload_ca-ceritificated.rpm maintenant, installez votre rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

maintenant redémarrez votre service: mon exemple cette commande:

sudo service2 httpd restart
Santos L. Victor
la source
0

Exécutez la commande suivante dans git bash qui fonctionne bien pour moi

git config --global http.sslverify "false"
J4cK
la source
0

Cela a résolu pour moi:

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

Ci-dessous, décrivez les étapes pour résoudre les problèmes.
1. Découvrez que le fichier existe sur l'URL de définition.
2. Sinon, téléchargez le fichier à partir de l'URL. https://curl.haxx.se/ca/cacert.pem
3. Copiez et pestez le fichier dans le chemin défini sur le fichier php.ini.
4. Redémarrez le service Apache.

tapas talukder
la source
0

J'ai eu ce problème et il s'est avéré que ma version de CURL ne pouvait pas analyser les certificats encodés DER (et ne faisait pas non plus attention à l'option --cert-type). Lorsque j'ai converti le certificat au format PEM, cela a fonctionné.

Joshua Davies
la source
0

Dans mon cas, le /etc/ssl/certs/ca-certificates.crtfichier manquait. Il s'est avéré que j'ai supprimé le contenu de /etc/ssl/certsdans le Dockerfile lors de la création de l'image Docker. Après avoir ajusté mes scripts shell / commandes bash exécutées à partir du Dockerfile - curl fonctionne maintenant parfaitement à partir du nouveau conteneur.

Nomade Tech
la source