J'utilise WAMP dans un environnement de développement local et j'essaie de charger une carte de crédit, mais le message d'erreur suivant s'affiche:
erreur cURL 60: problème de certificat SSL: impossible d'obtenir le certificat de l'émetteur local
J'ai beaucoup cherché sur Google et beaucoup de gens suggèrent de télécharger ce fichier: cacert.pem , le mettre quelque part et le référencer dans mon php.ini. C'est la partie de mon php.ini:
curl.cainfo = "C:\Windows\cacert.pem"
Pourtant, même après avoir redémarré mon serveur plusieurs fois et modifié le chemin d'accès, le même message d'erreur s'affiche.
J'utilise WAMP des modules Apache et le ssl_module est activé. Et depuis les extensions PGP, j'ai php_curl activé.
Toujours le même message d'erreur. Pourquoi est-ce que ça se passe?
Maintenant, je suis ce correctif: Comment réparer PHP CURL Error 60 SSL
Ce qui suggère que j'ajoute ces lignes à mes options cURL:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
Où puis-je ajouter des options à mon CURL? Apparemment pas via la ligne de commande, car mon CLI ne trouve pas la commande "curl_setopt"
MODIFIER
C'est le code que je suis en train d'exécuter:
public function chargeStripe()
{
$stripe = new Stripe;
$stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));
$charge = $stripe->charges()->create([
'amount' => 2900,
'customer' => Input::get('stripeEmail'),
'currency' => 'EUR',
]);
dd($charge);
// echo $charge[Input::get('stripeToken')];
return Redirect::route('step1');
}
solution de travail:
Serveur XAMPP
similaire pour les autres environnements - télécharger et extraire ici pour cacert.pem (un format de fichier propre)
C:\xampp\php\extras\ssl\cacert.pem
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
Problème résolu!
Si vous utilisez PHP 5.6 avec Guzzle, Guzzle utilise maintenant la détection automatique des bibliothèques PHP pour les certificats plutôt que son traitement ( ref ). PHP décrit les modifications ici .
Vous pouvez vider où PHP cherche en utilisant:
var_dump(openssl_get_cert_locations());
Pour tester OS X, vous pouvez utiliser homebrew pour installer openssl brew install openssl
, puis utiliser openssl.cafile=/usr/local/etc/openssl/cert.pem
dans vos paramètres de php.ini ou de Zend Server (sous OpenSSL).
Un ensemble de certificats est également disponible sur curl/Mozilla sur le site Web de curl: https://curl.haxx.se/docs/caextract.html
Une fois que vous avez un paquet, placez-le là où PHP est déjà à la recherche (ce que vous avez découvert ci-dessus) ou mettez à jour openssl.cafile
dans le fichier php.ini. (Généralement, /etc/php.ini
ou /etc/php/7.0/cli/php.ini
ou /etc/php/php.ini
sous Unix.)
Guzzle, qui est utilisé par cartalyst/stripe , procédera comme suit pour trouver une archive de certificats appropriée pour vérifier un certificat de serveur par rapport à:
openssl.cafile
est défini dans votre fichier php.ini.curl.cainfo
est défini dans votre fichier php.ini./etc/pki/tls/certs/ca-bundle.crt
existe (Red Hat, CentOS, Fedora; fourni par le package ca-certificates)/etc/ssl/certs/ca-certificates.crt
existe (Ubuntu, Debian; fourni par le paquet ca-certificates)/usr/local/share/certs/ca-root-nss.crt
existe (FreeBSD; fourni par le paquet ca_root_nss)/usr/local/etc/openssl/cert.pem
(OS X; fourni par homebrew)C:\windows\system32\curl-ca-bundle.crt
existe (Windows)C:\windows\curl-ca-bundle.crt
existe (Windows)Vous voudrez vous assurer que les valeurs des deux premiers paramètres sont correctement définies en effectuant un simple test:
echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
Sinon, essayez d'écrire le fichier aux emplacements indiqués par # 7 ou # 8.
Si vous ne parvenez pas à modifier le fichier php.ini, vous pouvez également pointer sur le fichier cacert.pem à partir du code suivant:
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
Ce que j'ai fait était d'utiliser var_dump(openssl_get_cert_locations()); die;
dans n'importe quel script php, ce qui m'a donné les informations sur les valeurs par défaut utilisées par mon php local:
array (size=8)
'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
'ini_capath' => string '' (length=0)
Comme vous pouvez le constater, j'ai défini l'option ini_cafile ou l'option ini curl.cainfo. Mais dans mon cas, curl essaierait d’utiliser le fichier "default_cert_file" qui n’existait pas.
J'ai copié le fichier de https://curl.haxx.se/ca/cacert.pem dans l'emplacement correspondant à "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) et j'étais capable de le faire fonctionner.
C'était la seule solution pour moi.
J'ai trouvé une solution qui a fonctionné pour moi. Je suis passé de la dernière version à la version 4.0 et cela a fonctionné.
Dans composer.json, ajoutez "guzzlehttp/guzzle": "~ 4.0"
J'espère que ça aide quelqu'un
Ce problème est apparu à l'improviste un jour, lorsqu'un script Guzzle (5) tentait de se connecter à un hôte via SSL. Bien sûr, je pourrais désactiver l’option VERIFY dans Guzzle/Curl, mais ce n’est clairement pas la bonne façon de faire.
J'ai essayé tout énuméré ici et dans des threads similaires, puis, finalement, je suis allé au terminal avec openssl pour tester le domaine avec lequel j'essayais de me connecter:
openssl s_client -connect example.com:443
... et reçu les premières lignes indiquant:
CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
... alors que tout fonctionnait bien lorsque vous tentiez d'autres destinations (google.com, etc.)
Cela m’a incité à contacter le domaine auquel je tentais de me connecter et, en fait, ils ont eu un problème qui s’est posé. Le problème a été résolu et mon script est revenu au travail.
Alors ... si vous vous arrachez les cheveux, tentez votre chance et voyez s'il y a quelque chose qui cloche dans la réponse de l'endroit où vous essayez de vous connecter. Peut-être que le problème n'est pas si «local» après tout, parfois.
Assurez-vous d’ouvrir le fichier php.ini
directement avec votre explorateur Windows. (dans mon cas: C:\DevPrograms\wamp64\bin\php\php5.6.25
).
N'utilisez pas le raccourci vers php.ini
dans le menu de l'icône Wamp/Xamp dans la zone de notification. Ce raccourci ne fonctionne pas dans ce cas.
Puis éditez ce php.ini
:
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
et
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
Après avoir enregistré php.ini
, vous n'avez pas besoin de "Redémarrer tous les services" dans l'icône Wamp ou de fermer/réouvrir CMD.
Je viens de rencontrer le même problème avec le framework Laravel 4 php qui utilise le paquetage guzzlehttp/guzzle
composer. Pour une raison quelconque, le certificat SSL de mailgun a cessé de valider brusquement et j'ai reçu le même message "erreur 60".
Si, comme moi, vous êtes sur un hébergement partagé sans accès à php.ini
, les autres solutions ne sont pas possibles. Dans tous les cas, Guzzle a ce code d’initialisation de ce client susceptible d’annuler les effets php.ini
:
// vendor/guzzlehttp/guzzle/src/Client.php
$settings = [
'allow_redirects' => true,
'exceptions' => true,
'decode_content' => true,
'verify' => __DIR__ . '/cacert.pem'
];
Ici, Guzzle force l'utilisation de son propre fichier interne cacert.pem, qui est probablement maintenant obsolète, au lieu d'utiliser celui fourni par l'environnement de cURL . Changer cette ligne (au moins sous Linux) configure Guzzle pour qu'il utilise la logique de vérification SSL par défaut de cURL et corrige mon problème:
'verify' => true
Vous pouvez également définir ceci sur false
si vous ne vous souciez pas de la sécurité de votre connexion SSL, mais ce n'est pas une bonne solution.
Comme les fichiers dans vendor
ne sont pas destinés à être falsifiés, une meilleure solution serait de configurer le client Guzzle sur l’utilisation, mais cela était trop difficile à faire dans Laravel 4.
J'espère que cela épargnera à quelqu'un d'autre quelques heures de débogage ...
Cela pourrait être un cas Edge, mais dans mon cas, le problème n'était pas le client conf (j'avais déjà curl.cainfo
configuré dans php.ini
), mais plutôt le le serveur n'est pas configuré correctement:
Il n'a envoyé aucun certs intermédiaire dans la chaîne. Aucune erreur ne s'est produite lors de la navigation sur le site à l'aide de Chrome, mais avec PHP, l'erreur suivante s'est produite.
erreur cURL 60
Après avoir inclus les Intermediate Certs dans la configuration du serveur Web distant, cela a fonctionné.
Vous pouvez utiliser ce site pour vérifier la configuration SSL de votre serveur:
J'ai passé trop de temps à résoudre ce problème pour moi.
J'avais PHP version 5.5 et j'avais besoin de passer à la version 5.6.
Dans les versions <5.6, Guzzle utilisera son propre fichier cacert.pem, mais dans les versions supérieures de PHP, il utilisera le fichier cacert.pem du système.
J'ai aussi téléchargé le fichier à partir d'ici https://curl.haxx.se/docs/caextract.html et le mets dans php.ini.
Réponse trouvée dans Guzzles StreamHandler.php fichier https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437
// PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert.
Toutes les réponses sont correctes ; mais la chose la plus importante est que vous devez trouver le bon fichier php.ini. Cochez cette commande dans cmd "php --ini" n’est pas la bonne réponse pour trouver le bon fichier php.ini.
si vous éditez
curl.cainfo ="PATH/cacert.pem"
et vérifie
var_dump(openssl_get_cert_locations());
alors curl.cainfo devrait avoir une valeur. sinon, le fichier php.ini n'est pas correct;
* Je vous recommande de rechercher * .ini dans wamp/bin ou xxamp/bin ou tout serveur que vous utilisez, de les modifier un par un et de les vérifier. *
As-tu essayé..
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
Si vous utilisez une source fiable, vous n’avez pas besoin de vérifier le certificat SSL.
quand j’exécute 'var_dump(php_ini_loaded_file());'
j’obtiens cette sortie sur ma page 'C:\Development\bin\Apache\apache2.4.33\bin\php.ini' (length=50)'
et pour que php charge mon fichier de certificat, je devais éditer le fichier php.ini dans ce chemin 'C:\Development\bin\Apache\apache2.4.33\bin\php.ini'
.__ et ajouter openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"
où j'avais téléchargé et placer mon fichier de certificat depuis https://curl.haxx.se/docs /caextract.html
suis sur windows 10, en utilisant drupal 8, wamp et php7.2.4