web-dev-qa-db-fra.com

erreur cURL 60: certificat SSL: impossible d'obtenir le certificat de l'émetteur local

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');
}
164
LoveAndHappiness

solution de travail:

  • En supposant que sur les fenêtres 

Serveur XAMPP

similaire pour les autres environnements - télécharger et extraire ici pour cacert.pem (un format de fichier propre) 

https://curl.haxx.se/docs/caextract.html

  • mets-le ici 

C:\xampp\php\extras\ssl\cacert.pem

  • dans votre php.ini mettez cette ligne dans cette section ("c:\xampp\php\php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  • redémarrez votre serveur web/Apache

Problème résolu!

(source: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )

419
Dung

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 .

Découvrir où PHP/Guzzle cherche des certificats

Vous pouvez vider où PHP cherche en utilisant:

 var_dump(openssl_get_cert_locations());

Obtenir un paquet de certificats

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

Dire PHP où sont les certificats

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.)

35
Loren

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 à:

  1. Vérifiez si openssl.cafile est défini dans votre fichier php.ini.
  2. Vérifiez si curl.cainfo est défini dans votre fichier php.ini.
  3. Vérifiez si /etc/pki/tls/certs/ca-bundle.crt existe (Red Hat, CentOS, Fedora; fourni par le package ca-certificates)
  4. Vérifiez si /etc/ssl/certs/ca-certificates.crt existe (Ubuntu, Debian; fourni par le paquet ca-certificates)
  5. Vérifiez si /usr/local/share/certs/ca-root-nss.crt existe (FreeBSD; fourni par le paquet ca_root_nss)
  6. Vérifiez si /usr/local/etc/openssl/cert.pem (OS X; fourni par homebrew)
  7. Vérifier si C:\windows\system32\curl-ca-bundle.crt existe (Windows)
  8. Vérifier si 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.

11
Ja͢ck

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);
10
mvandillen

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.

6
George Donev

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

5
Iruku Kagika

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.

5
Daydream Nation

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. 

1
Quang Nguyen Tri

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 ...

1
bernie

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: 

https://whatsmychaincert.com/

1
Tobias K.

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.
1

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. *

0
Mohsen Molaei

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.

0
Mike Miller

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

0
Nicholas