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

194

J'exécute la version 5.6.3 de PHP dans le cadre de XAMPP sur Windows 7.

Lorsque j'essaye d'utiliser l'API Mandrill, j'obtiens l'erreur suivante:

Exception non interceptée «Mandrill_HttpError» avec le message «Échec de l'appel d'API aux messages / modèle d'envoi: 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 l'ajout de ce qui suit au fichier php.ini:

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

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

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

Je ne sais vraiment pas quoi essayer d'autre.

Quelqu'un peut-il conseiller sur ce que je peux essayer d'autre?

Dor Dadush
la source
Voir ma réponse: stackoverflow.com/a/29649024/660410
Michal
3
Assurez-vous également que vous avez décommenté cette ligne en supprimant le début «;». il devrait être curl.cainfo = "C: \ xampp \ php \ cacert.pem" plutôt que; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan
L'utilisation de HTTPS sur HTTP entraînerait-elle également cette erreur?
javiniar.leonard

Réponses:

381

Enfin obtenu que cela fonctionne!

  1. Téléchargez le kit de certificats .

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

  3. Activer mod_ssldans Apache et php_openssl.dlldans php.ini(décommentez-les en les supprimant ;au début). Mais attention, mon problème était que j'avais deux php.inifichiers et que je devais le faire dans les deux. L'un est celui que vous obtenez de l'icône de la barre des tâches WAMP, et un autre est, dans mon cas, enC:\wamp\bin\php\php5.5.12\

  4. Ajoutez ces lignes à votre certificat dans les deux php.inifichiers:

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

Mladen Janjetovic
la source
3
Dans mon cas, c'était le répertoire c: \ xamp \ et ses fenêtres 7 et cette solution fonctionne parfaitement..merci beaucoup ...
Manu RS
1
Le plus récent ensemble de certificats peut être téléchargé à partir du site curl d'origine curl.haxx.se/docs/caextract.html
Paul
1
Dans mon cas, la ligne avait un ;au début et il m'a fallu des heures pour réaliser que cela signifie que c'est un commentaire. donc pour noobs comme moi, il faut supprimer le ;aussi bien
abhyudayasrinet
1
@SurajNeupane pas sûr, j'ai passé beaucoup de temps à obtenir celui-ci à l'époque, j'utilise des machines virtuelles, comme Homestead et je n'ai pas à gérer cela. C'était un cas spécifique
Mladen Janjetovic
3
C'est la cléBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA
133

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 numéro 65 où il est dit $ 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 a également envoyé un e-mail en utilisant localhost, mais je suggère de ne pas l'utiliser sur la version live en direct. Sur votre serveur en direct, le code devrait fonctionner sans ce code.

Shehzad Nizamani
la source
1
Est-ce que je peux essayer de faire fonctionner mon environnement de développeurs sans ce contournement?
Dor Dadush
5
pour moi, avec juste mise CURLOPT_SSL_VERIFYPEERau falsetravail.
Francisco Corrales Morales
29
Bien que vous ayez techniquement raison, désactiver SSL est une mauvaise idée. Même sur localhost, il est préférable de charger correctement les certificats comme mentionné dans l'autre réponse.
Spinal
Bien que vous ayez techniquement raison, la désactivation de SSL est une mauvaise idée. Même s'il résiste avec véhémence à travailler d'une autre manière, mieux vaut perdre votre travail que de faire les choses de manière non appropriée par sys-admin. @Spinal
45

Merci @Mladen Janjetovic,

Votre suggestion a fonctionné pour moi dans mac avec des ampps installés.

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

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

Et mis php.inià jour 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 également parfaitement fonctionné.

[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 cherchez à générer un nouveau certificat SSL en utilisant SAN pour localhost, les étapes de cet article ont fonctionné pour moi Centos 7 / Vagrant / Chrome Browser.

Damodar Bashyal
la source
18

Lorsque vous affichez la page http://curl.haxx.se/docs/caextract.html , vous remarquerez en gros caractères une section appelée:

RSA-1024 supprimé

Lisez-le, puis téléchargez la version des certificats qui comprend les certificats «RSA-1024». https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Ceux-ci fonctionneront avec Mandrill.

La désactivation de SSL est une mauvaise idée.

Arturo Alvarado
la source
1
Cela a résolu un problème avec AWS / Guzzle / cURL avec lequel je me suis battu toute la journée. Merci!
voidstate
@voidstate Je sais que c'est vieux mais vous pouvez aussi le contourner dans guzzle en utilisant ceci ['verify' => false], pour la doc complète sur ssl / curl / guzzle allez ici guzzle.readthedocs.org/en/latest/…
John
@John mais cela désactiverait la vérification SSL qui n'est pas ce que vous voulez faire, donc je ne suggérerais pas de le faire.
Arturo Alvarado
1
Pour Windows, vous devrez enregistrer les fichiers sur votre serveur (par exemple dans C: \ curl \ curl-ca-bundle.crt), puis ajouter ce qui suit à votre php.ini: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate
Je viens de l'avoir après que cela a fonctionné parfaitement pendant des siècles (même survécu à un changement de serveur) mais j'ai du mal à comprendre exactement ce qui se passe ici. Est-ce que curl ou openssl a été mis à jour et que ca-bundle a été remplacé par un paquet incompatible avec mailchimp?
Sammaye
11

Les étapes ci-dessus, bien qu'utiles, n'ont pas fonctionné pour moi sur Windows 8. Je ne connais pas la co-relation, mais les étapes ci-dessous ont fonctionné. Fondamentalement, un changement dans le fichier cacert.pem. J'espère que cela 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: \ Installation_Dir \ xampp \ php \ cacert.pem)
  • Ouvrez votre fichier php.ini et ajoutez ces lignes:
  • curl.cainfo = "C: \ Installation_Dir \ xampp \ php \ cacert.pem" openssl.cafile = "C: \ Installation_Dir \ xampp \ php \ cacert.pem"
  • Redémarrez votre serveur Apache et cela devrait le réparer (arrêtez et démarrez simplement les services si nécessaire).
HopeKing
la source
11

J'ai trouvé une nouvelle solution sans aucune certification requise pour appeler curl uniquement ajouter un code de deux lignes.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Manish Sharma
la source
9
Bien que cela puisse fonctionner, ce n'est pas du tout recommandé. En gros, vous dites, faites confiance à tous les certificats ... et cela ouvre également votre application à une éventuelle attaque si vous oubliez et que votre code arrive en production avec ce changement ... ce n'est vraiment pas beaucoup de travail de télécharger le bundle CA et ajoutez-y un point PHP.
user919426
c'est le concept de curl, donc chaque fois que vous utilisez curl, ajoutez le code ci-dessus
Manish sharma
9

Si vous n'avez pas accès à php.ini , l'ajout de ce code (après votre $ch = curl_init();ligne) 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é dans $certificate_location.

interdiction de la géo-ingénierie
la source
3

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

Allez sur Laravel Root Folder -> Vender -> guzzlehttp -> guzzle -> src

ouvrez Client.php

find $ defaults Array. qui ressemblent à ça ...

$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 la clé de vérification .

'verify'          => false,

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

Pankaj
la source
2

é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 lors du déploiement.

Noel
la source
Exécuter différentes parties de votre code dans différents environnements ne semble pas être un bon concept - cela rend le débogage plus difficile
Nico Haase
2

J'ai essayé ça ça marche

ouvert

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

et change ça

 $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;
Yuan Libres
la source
1

J'étais confronté à un problème comme celui-ci dans mon système local mais pas dans le serveur en direct. J'ai également mentionné une autre solution sur cette page, mais cela ne fonctionnait pas dans localhost. Trouvez donc une nouvelle solution à ce problème, qui fonctionne dans le serveur localhost-WAMP .

Erreur cURL #: problème de certificat SSL: impossible d'obtenir le certificat de l' émetteur local

parfois le système ne pouvait pas trouver votre cacert.pem dans votre lecteur. afin que vous puissiez définir cela dans votre code où vous allez utiliser CURL

Notez que je remplis toutes les conditions pour cela, comme la bibliothèque OPEN-SSL active et d'autres choses.

vérifiez ce code de CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

mais cette solution peut ne pas fonctionner sur un serveur en direct. à cause du chemin absolu de cacert.pem

Pankaj Kumar
la source
0

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

  • Téléchargez https://curl.haxx.se/ca/cacert.pem surc:\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
Face cachée
la source
0

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

J'utilisais 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 ne fonctionnait pas non plus semble être une combinaison de paramètres apache et php sur cette version de XAMPP.

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

ccrez
la source
0

J'ai eu l'erreur comme:

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

J'utilise une 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 cela peut aider quelqu'un

S Debasish Nayak
la source
0

J'ai une solution appropriée à ce problème, essayons de comprendre la cause première de ce problème. Ce problème survient lorsque les serveurs distants ssl ne peuvent pas être vérifiés à l'aide de certificats racine dans le magasin de certificats de votre système ou lorsque ssl distant n'est pas installé avec les certificats de chaîne. Si vous avez un système Linux avec un accès root ssh, dans ce cas, vous pouvez essayer de mettre à jour votre magasin de certificats avec la commande ci-dessous:

update-ca-certificates

Si toujours, cela ne fonctionne pas, vous devez ajouter le certificat racine et provisoire du serveur distant dans votre magasin de certificats. Vous pouvez télécharger les certificats racine et intermédiaires et les ajouter dans le répertoire / usr / local / share / ca-certificates , puis exécuter la commande update-ca-certificates. Cela devrait faire l'affaire. De même pour Windows, vous pouvez rechercher comment ajouter un certificat racine et intermédiaire.

L'autre façon de résoudre ce problème consiste à demander à l'équipe de serveurs distants d'ajouter un certificat SSL en tant que bundle de certificat racine de domaine, de certificat intermédiaire et de certificat racine.

prasoon
la source
-4

pour guzzle, vous pouvez essayer ceci:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

testé sur guzzle / guzzle 3. *

fico7489
la source
1
y a-t-il un point à répondre à une question vieille de 3 ans qui a une réponse acceptée avec plus de 200 votes positifs?
treyBake
ma réponse est plus simple que celles ci-dessus, vous verrez que j'obtiendrai 10 votes positifs pendant quelques mois ...
fico7489
1
J'en doute fortement, ne voyant aucune mention de guzzle dans OP ... donc c'est une réponse sans rapport. C'est la même chose quand quelqu'un fournit une solution jQuery pour un problème JavaScript. Ce n'est pas pertinent.
treyBake
cela ne change rien au fait qu'il n'est pas utilisé ici. Proposeriez-vous une solution Linux à un utilisateur Windows car c'est le système d'exploitation serveur le plus utilisé? Tout le monde ne veut pas utiliser Guzzle, personnellement je ne l'ai jamais utilisé une seule fois au cours de mes années d'utilisation de PHP. Pour moi, une requête HTTP n'est vraiment pas si difficile d'avoir besoin d'un package pour cela.
treyBake
1
pleinement conscient - ce n'est tout simplement pas nécessaire .. il suffit de lire la documentation pour curl et tout cela va de soi. Il ne s'agit pas d'être plus intelligent ... il s'agit de répondre correctement à la question
treyBake