web-dev-qa-db-fra.com

HTTPS et SSL3_GET_SERVER_CERTIFICATE: échec de la vérification du certificat, CA est OK

J'utilise XAMPP pour le développement. Récemment, j'ai mis à niveau mon installation de xampp d'une ancienne version vers la version 1.7.3.

Maintenant, lorsque je curlise des sites compatibles HTTPS, je reçois l'exception suivante

Erreur fatale: exception non capturée 'RequestCore_Exception' avec le message 'ressource cURL: ID de ressource n ° 55; Erreur cURL: problème de certificat SSL, vérifiez que le certificat de l'autorité de certification est OK. Détails: erreur: 14090086: Routines SSL: SSL3_GET_SERVER_CERTIFICATE: échec de la vérification du certificat (60) '

Tout le monde suggère d'utiliser certaines options curl spécifiques à partir du code PHP pour résoudre ce problème. Je pense que cela ne devrait pas être le chemin. Parce que je n’avais aucun problème avec mon ancienne version de XAMPP et n’est arrivé qu’après l’installation de la nouvelle version.

J'ai besoin d'aide pour savoir quels paramètres changent dans mon installation PHP, Apache, etc., peut résoudre ce problème.

204
Josnidhin

curl utilisé pour inclure une liste des autorités de certification acceptées, mais ne regroupe plus AUCUN certificat. Donc, par défaut, tous les certificats SSL seront considérés comme invérifiables.

Vous devrez obtenir le certificat et le point de virage de votre autorité de certification. Plus de détails chez cURLS Détails sur les certificats SSL du serveur .

142
Marc B

C'est un problème assez courant sous Windows. Il vous suffit de régler cacert.pem sur curl.cainfo.

Depuis PHP 5.3.7, vous pouvez faire:

  1. télécharger https://curl.haxx.se/ca/cacert.pem et enregistrez-le quelque part.
  2. update php.ini - add curl.cainfo = "PATH_TO/cacert.pem"

Sinon, vous devrez procéder comme suit pour chaque ressource cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

Avertissement: cela peut entraîner des problèmes de sécurité contre lesquels SSL est conçu, rendant votre base de code non sécurisée. Cela va à l'encontre de toutes les pratiques recommandées.

Mais une solution très simple qui a fonctionné pour moi a été d'appeler:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

avant d'appeler:

curl_exec():

dans le fichier php.

Je crois que cela désactive toute vérification des certificats SSL.

82
Chris Dutrow

Source: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Curl: Problème de certificat SSL, vérifiez que le certificat de l'autorité de certification est correct

07 avril 2006

Lorsque vous ouvrez une URL sécurisée avec Curl, vous pouvez obtenir l’erreur suivante:

Problème de certificat SSL, vérifiez que le certificat de l'autorité de certification est correct

Je vais expliquer pourquoi l'erreur et ce que vous devriez faire à ce sujet.

Le moyen le plus simple de supprimer l'erreur consiste à ajouter les deux lignes suivantes à votre script. Cette solution pose cependant un risque de sécurité.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Voyons ce que font ces deux paramètres. Citant le manuel.

CURLOPT_SSL_VERIFYHOST : 1 pour vérifier l’existence d’un nom commun dans le certificat homologue SSL. 2 pour vérifier l'existence d'un nom commun et également vérifier qu'il correspond au nom d'hôte fourni.

CURLOPT_SSL_VERIFYPEER : FALSE pour empêcher CURL de vérifier le certificat de l'homologue. D'autres certificats à vérifier peuvent être spécifiés avec l'option CURLOPT_CAINFO ou un répertoire de certificats avec l'option CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST peut également avoir besoin d'être VRAI ou FAUX si CURLOPT_SSL_VERIFYPEER est désactivé (la valeur par défaut est 2). Définir CURLOPT_SSL_VERIFYHOST sur 2 (valeur par défaut) garantit que le certificat qui vous est présenté a un "nom commun" correspondant à l'URN utilisé pour accéder à la ressource distante. C'est un bon contrôle, mais cela ne garantit pas que votre programme ne sera pas trompé.

Entrez l'homme au milieu

Votre programme pourrait être induit en erreur en parlant à un autre serveur. Ceci peut être réalisé à travers plusieurs mécanismes, comme une intoxication DNS ou arp (Ceci est une histoire pour un autre jour). L'intrus peut également signer lui-même un certificat portant le même nom commun que celui attendu par votre programme. La communication serait toujours cryptée mais vous dévoileriez vos secrets à un imposteur. Ce genre d'attaque s'appelle "l'homme au milieu"

Vaincre "l'homme au milieu"

Eh bien, nous devons vérifier que le certificat qui nous est présenté est bon pour de vrai. Nous le faisons en le comparant à un certificat en lequel nous avons * confiance.

Si la ressource distante est protégée par un certificat émis par l'une des principales autorités de certification, telles que Verisign, GeoTrust et autres, vous pouvez comparer en toute sécurité le paquet de certificats de CA de Mozilla, que vous pouvez obtenir de http://curl.haxx.se /docs/caextract.html

Enregistrez le fichier cacert.pem quelque part sur votre serveur et définissez les options suivantes dans votre script.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

pour tout ce qui précède, le crédit d’information va à: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

52
Deepak Oberoi

Les solutions ci-dessus sont excellentes, mais si vous utilisez WampServer, vous pouvez trouver que définir la variable curl.cainfo dans php.ini ne fonctionne pas.

J'ai finalement trouvé que WampServer avait deux fichiers php.ini:

C:\wamp\bin\Apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Le premier est apparemment utilisé lorsque PHP fichiers sont appelés via un navigateur Web, tandis que le second est utilisé lorsqu'une commande est appelée via la ligne de commande ou Shell_exec().

TL; DR

Si vous utilisez WampServer, vous devez ajouter la ligne curl.cainfo aux fichiers bothphp.ini.

16
Nate

Pour l'amour de tout ce qui est saint ...

Dans mon cas, je devais définir la variable openssl.cafile PHP config sur le chemin du fichier PEM.

J'espère que c'est très vrai qu'il existe de nombreux systèmes dans lesquels configurer curl.cainfo dans la configuration de PHP correspond exactement à ce qui est nécessaire, mais dans l'environnement avec lequel je travaille, le eboraas/laravel Docker Container, qui utilise Debian 8 (Jessie) et PHP 5.6, définir cette variable n’a pas suffi.

J'ai remarqué que la sortie de php -i ne mentionnait rien sur ce paramètre de configuration particulier, mais elle contenait quelques lignes sur openssl. Il existe à la fois une option openssl.capath et openssl.cafile, mais il suffit de définir la deuxième option permettant à curl via PHP de fonctionner correctement avec les URL HTTPS.

6
Spencer Williams

Parfois, si l'application que vous essayez de contacter possède des certificats auto-signés, le fichier cacert.pem normal http://curl.haxx.se/ca/cacert.pem ne résout pas le problème.

Si vous êtes sûr de l'URL du noeud final du service, appuyez dessus via le navigateur, enregistrez le certificat manuellement au format "Certificat X 509 avec chaîne (PEM)". Pointez ce fichier de certificat avec le

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
4
madRai

J'ai la même erreur sur Amazon AMI Linux.

J'ai résolu en plaçant curl.cainfo sur /etc/php.d/curl.ini

https://Gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

Ajout octobre 2018

Sur Amazon Linux v1, éditez ce fichier

vi /etc/php.d/20-curl.ini

Ajouter cette ligne

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
4
Reinaldo Mendes

Lorsque vous définissez les options de courbe pour CURLOPT_CAINFO, n'oubliez pas d'utiliser des guillemets simples. L'utilisation de guillemets doubles ne provoquera qu'une autre erreur. Donc, votre option devrait ressembler à:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

De plus, dans votre fichier php.ini, les paramètres doivent être écrits ainsi: (notez mes guillemets doubles)

curl.cainfo = "C:\wamp\www\mywebfolder"

Je le mets directement sous la ligne qui dit ceci: extension=php_curl.dll

(À des fins d'organisation uniquement, vous pouvez le placer n'importe où dans votre php.ini, je le mets juste à proximité d'une autre référence curl. Ainsi, lorsque je recherche à l'aide du mot clé curl, je peux trouver les deux références curl dans un domaine.)

3
LOwens1931

Je me suis retrouvé ici en essayant d'obtenir que GuzzleHttp (php + Apache sur Mac) reçoive une page sur www.googleapis.com.

Voici ma solution finale au cas où cela aiderait quelqu'un.

Examinez la chaîne de certificats pour le domaine qui vous donne cette erreur. Pour moi c'était googleapis.com

openssl s_client -Host www.googleapis.com -port 443

Vous obtiendrez quelque chose comme ça:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Remarque: j'ai capturé cette information après avoir résolu le problème. Votre sortie en chaîne peut sembler différente.

Ensuite, vous devez regarder les certificats autorisés dans php. Exécutez phpinfo () dans une page.

<?php echo phpinfo();

Recherchez ensuite le fichier de certificat chargé à partir de la sortie de la page:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

C’est le fichier que vous devez corriger en y ajoutant le ou les certificats appropriés.

Sudo nano /usr/local/php5/ssl/certs/cacert.pem

Vous devez fondamentalement ajouter les "signatures" correctes du certificat à la fin de ce fichier.

Vous pouvez en trouver quelques-unes ici: Si vous en avez besoin, vous devrez peut-être chercher sur Google/rechercher d'autres personnes dans la chaîne.

Ils ressemblent à ceci:

example certificate image

( Remarque: il s'agit d'une image afin que les utilisateurs ne puissent pas simplement copier/coller des certificats de stackoverflow )

Une fois que les bons certificats sont dans ce fichier, redémarrez Apache et testez.

2
TrophyGeek

Vous pouvez essayer de réinstaller le package ca-certificates ou autoriser explicitement le certificat en question, comme décrit ici .

0
site