web-dev-qa-db-fra.com

curl: (60) certificat SSL: impossible d'obtenir le certificat de l'émetteur local

root@sclrdev:/home/sclr/certs/FreshCerts# curl --ftp-ssl --verbose ftp://{abc}/ -u trup:trup --cacert /etc/ssl/certs/ca-certificates.crt
* About to connect() to {abc} port 21 (#0)
*   Trying {abc}...
* Connected to {abc} ({abc}) port 21 (#0)
< 220-Cerberus FTP Server - Home Edition
< 220-This is the UNLICENSED Home Edition and may be used for home, personal use only
< 220-Welcome to Cerberus FTP Server
< 220 Created by Cerberus, LLC
> AUTH SSL
< 234 Authentication method accepted
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
150
user3812540

Relatif à l'erreur 'Problème de certificat SSL: impossible d'obtenir le certificat de l'émetteur local'. Bien évidemment, cela s’applique au système qui envoie la demande CURL (et non au serveur qui reçoit la demande)

1) Téléchargez le dernier fichier cacert.pem à partir de https://curl.haxx.se/ca/cacert.pem

2) Ajoutez la ligne suivante à php.ini (s'il s'agit d'un hébergement partagé et que vous n'avez pas accès à php.ini, vous pouvez l'ajouter à .user.ini dans public_html)

curl.cainfo="/path/to/downloaded/cacert.pem"

Assurez-vous de placer le chemin entre guillemets doubles !!!

3) Par défaut, le processus FastCGI analyse les nouveaux fichiers toutes les 300 secondes (si nécessaire, vous pouvez modifier la fréquence en ajoutant quelques fichiers, comme suggéré ici. https://ss88.uk/blog/fast-cgi-and-user -ini-files-the-new-htaccess/ )

162
Dahomz

Il échoue car cURL est incapable de vérifier le certificat fourni par le serveur.

Il y a deux options pour que cela fonctionne:

  1. Utilisez cURL avec l'option -k qui permet à curl d'établir des connexions non sécurisées, cURL ne vérifie pas le certificat.

  2. Ajoutez l'autorité de certification racine (l'autorité de certification signant le certificat de serveur) à etc/ssl/certs/ca-certificates.crt

Vous devez utiliser l’option 2, car elle permet de vous connecter à un serveur FTP sécurisé.

83
Yuvika

J'ai résolu ce problème en ajoutant un code de ligne dans le script cURL:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Attention : Ceci rend la requête absolument non sécurisée (voir la réponse de @YSU)!

58
Vijay Bhandari

Avait ce problème après l'installation de Git Extensions v3.48. J'ai essayé d'installer mysysgit à nouveau, mais le même problème. À la fin, il a fallu désactiver (veuillez tenir compte des implications pour la sécurité!) La vérification Git SSL avec:

git config --global http.sslVerify false

mais si vous avez un certificat de domaine, ajoutez-le à (Win7)

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
18
Riga

Dans mon cas, l’installation de mon certificat sur le service que j’essayais de consommer avec cURL s’avérait problématique. Je n'ai pas réussi à regrouper/concaténer les certificats intermédiaires et racine dans mon certificat de domaine . Au début, il n’était pas évident que ce soit le problème, car Chrome a réglé le problème et a accepté le certificat en dépit de l’omission des certificats intermédiaires et racine.

Après avoir regroupé le certificat, tout a fonctionné comme prévu. Je me suis groupé comme ça

$ cat intermediate.crt >> domain.crt

Et répété pour tous les certificats intermédiaire et racine.

12
Daniel Watrous

Nous avons rencontré cette erreur récemment. Il s'avère que cela était lié au certificat racine qui n'est pas installé correctement dans le répertoire de stockage CA. J'utilisais une commande curl où je spécifiais directement le répertoire de l'autorité de certification. curl --cacert /etc/test/server.pem --capath /etc/test ... Cette commande échouait à chaque fois avec curl: (60) Problème de certificat SSL: impossible d'obtenir le certificat de l'émetteur local.  

Après avoir utilisé strace curl ..., il a été déterminé que curl recherchait le fichier de certificat racine portant le nom 60ff2731.0, basé sur une convetion de nommage de hachage openssl. J'ai donc trouvé cette commande pour importer efficacement le certificat racine correctement: 

ln -s rootcert.pem `openssl x509 -hash -noout -in rootcert.pem`.0

qui crée un lien symbolique 

60ff2731.0 -> rootcert.pem

curl, sous les couvertures, lisez le certificat server.pem, a déterminé le nom du fichier de certificat racine (rootcert.pem), l'a converti en son nom de hachage, puis a effectué une recherche dans le fichier du système d'exploitation, mais ne l'a pas trouvé. 

Donc, à retenir, utilisez strace lors de l'exécution de curl lorsque l'erreur de curl est obscure (une aide précieuse), puis veillez à installer correctement le certificat racine à l'aide de la convention de dénomination openssl.

10
gp-coder

C'est très probablement un certificat manquant du serveur.

Racine-> Intermédiaire-> Serveur

Un serveur doit envoyer le serveur et intermédiaire au minimum.

Utilisez openssl s_client -showcerts -starttls ftp -crlf -connect abc:21 pour déboguer le problème.

Si un seul certificat est renvoyé (soit auto-signé, soit émis), vous devez choisir entre:

  1. faire réparer le serveur
  2. faites confiance à ce cert et ajoutez-le à votre magasin de certificats CA (ce n'est pas la meilleure idée)
  3. désactiver la confiance, par exemple curl -k (très mauvaise idée)

Si le serveur est retourné, plusieurs, mais sans inclure un certificat auto-signé (root):

  1. installez le certificat CA (racine) dans votre magasin d'autorité de certification pour la chaîne this, par exemple. google l'émetteur. (UNIQUEMENT si vous faites confiance à cette autorité de certification)
  2. faire réparer le serveur pour envoyer l'autorité de certification dans la chaîne
  3. faire confiance à un cert dans la chaîne
  4. désactiver la confiance

Si le serveur a renvoyé un certificat d'autorité de certification racine, alors qu'il ne se trouve pas dans votre magasin d'autorité de certification, vos options sont les suivantes:

  1. Ajouter (confiance)
  2. désactiver la confiance

J'ai ignoré les certs expirés/révoqués car aucun message ne l'indiquait. Mais vous pouvez examiner les certificats avec openssl x509 -text

Étant donné que vous vous connectez à un serveur ftp Home Edition ( https://www.cerberusftp.com/support/help/installing-a-certificate/ ), je dirai qu'il est auto-signé.

Merci de poster plus de détails, comme le résultat de openssl.

5
Jason Pyeron

Pour moi, la simple installation de certificats a aidé:

Sudo apt-get install ca-certificates
5
Maxim Krušina

Sur les fenêtres - si vous exécutez à partir de cmd

> curl -X GET "https://some.place"

Téléchargez cacert.pem à partir de https://curl.haxx.se/docs/caextract.html

Définir la variable d'environnement:

CURL_CA_BUNDLE = C:\Program Files\curl-7.57.0\src\cacert.pem

et recharger l'environnement

refreshenv

Maintenant réessayer

Raison du problème: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/ réponses/95548

1
RaSor

Mon cas était différent. J'héberge un site derrière un pare-feu. L'erreur a été causée par pfSense.

Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|

J'ai accidentellement trouvé la cause, grâce à cette réponse .


Tout va bien lorsque j'ai accédé à à mon site à partir de WAN.

Toutefois, lorsque le site était accessible depuis un réseau local (par exemple, lorsque Wordpress avait envoyé une demande curl à son propre serveur, malgré l’utilisation de WAN IP 49.x.x.x), la page de connexion pfSense lui avait été servie.

J'ai identifié le certificat en tant que pfSense webConfigurator Self-Signed Certificate. Pas étonnant que curl ait lancé une erreur.

Cause: Qu'est-ce qui s'est passé, c'est que curl utilisait l'adresse IP WAN du site 49.x.x.x. Mais, dans le contexte du serveur Web, l’IP WAN était le pare-feu.

Debug: J'ai découvert que je recevais le certificat pfSense.

Solution: Sur le serveur hébergeant le site, pointez son propre nom de domaine sur 127.0.0.1

En appliquant la solution, la demande de curl a été correctement traitée par le serveur Web et n'a pas été transmise au pare-feu qui a répondu en envoyant la page de connexion.

1
Gene

Sur les fenêtres, j'avais ce problème. Curl a été installé par mysysgit, le téléchargement et l’installation de la version la plus récente ont résolu le problème. 

Sinon, elles sont correctes instructions sur la façon de mettre à jour votre certificat de certification que vous pouvez essayer.

1
Steve

Selon cURL docs , vous pouvez également transmettre le certificat à la commande curl

Obtenez un certificat d'autorité de certification pouvant vérifier le serveur distant et utiliser le fichier option appropriée pour signaler ce certificat de certification à des fins de vérification lorsque de liaison. Pour les pirates de libcurl: curl_easy_setopt (curl, CURLOPT_CAPATH, capath);

Avec l'outil de ligne de commande curl: --cacert [file]

Par exemple: 

curl --cacert mycertificate.cer -v https://www.google.com
0
Giorgos Myrianthous

Jusqu'à présent, j'ai constaté que ce problème se produisait au sein des réseaux d'entreprise pour deux raisons, l'une ou les deux pouvant se produire dans votre cas:

  1. En raison de la manière dont les proxys réseau fonctionnent, ils ont leurs propres certificats SSL, modifiant ainsi les certificats que curl voit. Beaucoup ou la plupart des réseaux d'entreprise vous obligent à utiliser ces serveurs proxy.
  2. Certains programmes antivirus s'exécutant sur des PC clients agissent également de la même manière qu'un proxy HTTPS, de sorte qu'ils peuvent analyser votre trafic réseau. Votre programme antivirus peut avoir une option pour désactiver cette fonction (en supposant que vos administrateurs le permettent).

En remarque, le numéro 2 ci-dessus peut vous rendre mal à l'aise en ce qui concerne votre trafic censément sécurisé TLS en cours d'analyse. C'est le monde des affaires pour vous.

0
rdguam

Oui, vous devez également ajouter un certificat de CA. Ajout d'un extrait de code dans Node.js pour une vue claire.

var fs = require(fs)
var path = require('path')
var https = require('https')
var port = process.env.PORT || 8080;
var app = express();

https.createServer({
key: fs.readFileSync(path.join(__dirname, './path to your private key/privkey.pem')),
cert: fs.readFileSync(path.join(__dirname, './path to your certificate/cert.pem')),
ca: fs.readFileSync(path.join(__dirname, './path to your CA file/chain.pem'))}, app).listen(port)
0
Ravi Prakash