web-dev-qa-db-fra.com

PHP - Erreur de certificat SSL: impossible d'obtenir le certificat de l'émetteur local

J'utilise la version PHP 5.6.3 dans le cadre de XAMPP sous Windows 7.

Lorsque j'essaie d'utiliser l'API Mandrill, le message d'erreur suivant s'affiche:

Exception non capturée 'Mandrill_HttpError' avec le message 'Echec de l'appel de l'API aux messages/send-template: problème de certificat SSL: impossible d'obtenir le certificat de l'émetteur local'

J'ai déjà essayé tout ce que j'ai lu sur StackOverflow, y compris en ajoutant ce qui suit dans le fichier php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

Et bien sûr, le fichier cacert.pem a été téléchargé à cet emplacement depuis http://curl.haxx.se/docs/caextract.html

mais après tout cela, les serveurs XAMPP et Apache ont redémarré mais ont toujours la même erreur.

Je ne sais vraiment pas quoi d'autre essayer.

Quelqu'un peut-il conseiller sur quoi d'autre puis-je essayer?

134
Dor Dadush

Enfin obtenu cela au travail!

  1. Téléchargez le package certificat .

  2. Mettez-le quelque part. Dans mon cas, c’était le répertoire c:\wamp\ (si vous utilisez Wamp 64 bits, c’est alors c:\wamp64\).

  3. Activez mod_ssl dans Apache et php_openssl.dll dans php.ini (supprimez leur commentaire en supprimant ; au début). Mais attention, mon problème était que j'avais deux fichiers php.ini et que je devais le faire dans les deux. L’un est celui que vous obtenez à partir de l’icône de votre barre de tâches WAMP, et un autre est, dans mon cas, en C:\wamp\bin\php\php5.5.12\

  4. Ajoutez ces lignes à votre cert dans les deux fichiers php.ini:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. Redémarrez les services Wamp.

265
Mladen Janjetovic

Avertissement: Ce code rend votre serveur non sécurisé.

J'ai eu le même problème dans le fichier Mandrill.php après la ligne 65 où il est indiqué $ this-> ch = curl_init ();

Ajoutez les deux lignes suivantes:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Cela a résolu mon problème et également envoyé un courrier électronique en utilisant localhost mais je suggère de ne pas l'utiliser sur la version live. Sur votre serveur live, le code devrait fonctionner sans ce code.

97
Shehzad Nizamani

Merci @Mladen Janjetovic,

Votre suggestion a fonctionné pour moi dans mac avec Ampps installé.

Copié:http://curl.haxx.se/ca/cacert.pem

À:/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

Et mis à jour php.ini avec ce chemin et redémarré Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

Et appliqué le même paramètre dans l'installation de Windows AMPPS et cela a parfaitement fonctionné aussi.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Idem pour wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Si vous souhaitez générer un nouveau certificat SSL à l'aide de SAN pour localhost, suivez les étapes sur cet article a travaillé pour moi sur Centos 7 / Vagrant / Chrome Browser.

39
Damodar Bashyal

Les étapes ci-dessus, bien que utiles, ne fonctionnaient pas pour moi sous Windows 8. Je ne connais pas la relation, mais les étapes ci-dessous ont fonctionné. Fondamentalement, une modification du fichier cacert.pem. J'espère que ça aide quelqu'un.

  • Téléchargez le fichier cacert.pem à partir d’ici: http://curl.haxx.se/docs/caextract.html
  • Enregistrez le fichier dans votre dossier d'installation PHP. (par exemple: Si vous utilisez xampp - enregistrez-le dans c:\rép_installation\xampp\php\cacert.pem). 
  • Ouvrez votre fichier php.ini et ajoutez ces lignes:
  • curl.cainfo = "C:\rép_installation\xampp\php\cacert.pem" openssl.cafile = "C:\rép_install\xampp\php\cacert.pem" 
  • Redémarrez votre serveur Apache et cela devrait être corrigé (arrêtez et redémarrez le services si nécessaire).
10
HopeKing

J'ai trouvé une nouvelle solution sans aucune certification requise pour appeler Curl, ajoutez seulement deux lignes de code.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
7
Manish sharma

Si vous n'avez pas accès à php.ini, l'ajout de ce code (après votre ligne $ch = curl_init();) fonctionne pour moi:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Ensuite, il vous suffira de télécharger ca-bundle.crt et de l’enregistrer à l’emplacement spécifié par $certificate_location.

6
ban-geoengineering

élaborer sur les réponses ci-dessus pour le déploiement du serveur.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

devrait faire l'affaire pour l'environnement de développement sans compromettre le serveur lorsqu'il est déployé.

2
Noel

Si aucune des solutions ci-dessus ne fonctionne, essayez de mettre à jour votre installation XAMPP vers une version plus récente.

Je courais XAMPP avec PHP 5.5.11, le même code exact ne fonctionnait pas, je suis passé à XAMPP avec PHP 5.6.28 et les solutions ci-dessus ont fonctionné.

De plus, seule la mise à jour de PHP n'a pas fonctionné. Cela ressemble à une combinaison de paramètres Apache et php sur cette version de XAMPP.

J'espère que ça aide quelqu'un.

0
ccrez

J'ai essayé ça marche

ouvrir

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

et changer cela

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

pour ça

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;
0
Yuan Libres

J'ai la solution très simple de ce problème. Vous pouvez le faire sans aucun fichier de certificat.

Allez sur dossier racine Laravel -> Vender -> guzzlehttp -> guzzle -> src

open Client.php

find $ defaults Array. qui ressemble à cette façon ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

La tâche principale consiste maintenant à modifier la valeur de verify key ..

'verify'          => false,

Donc, après cela, le certificat SSL pour la demande CURL ne sera pas vérifié ... Cette solution fonctionne pour moi. Je trouve cette solution après de nombreuses recherches ...

0
pankaj

J'ai eu l'erreur comme:

failed loading cafile stream: `C:\xamppPhp\Apache\bin\curl-ca-bundle.crt`

J'utilise la machine Windows. J'ai donc suivi les étapes ci-dessous.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/Apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

J'espère que ça peut aider quelqu'un

0
S Debasish Nayak

J'ai eu le même problème lors de la création de mon application dans AppVeyor.

  • Télécharger https://curl.haxx.se/ca/cacert.pem à c:\php
  • Activer openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Localiser le certificatecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini
0
Facedown