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.
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/ )
Il échoue car cURL est incapable de vérifier le certificat fourni par le serveur.
Il y a deux options pour que cela fonctionne:
Utilisez cURL avec l'option -k
qui permet à curl d'établir des connexions non sécurisées, cURL ne vérifie pas le certificat.
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é.
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)!
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
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.
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.
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:
curl -k
(très mauvaise idée)Si le serveur est retourné, plusieurs, mais sans inclure un certificat auto-signé (root):
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:
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.
Pour moi, la simple installation de certificats a aidé:
Sudo apt-get install ca-certificates
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
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.
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.
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
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:
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.
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)