web-dev-qa-db-fra.com

Paypal Access - Certificat SSL: impossible d'obtenir le certificat d'émetteur local

Je travaille avec cUrl et PHP pour faire une demande à un serveur (pour l'accès Paypal)

Le site Web des développeurs Paypal ne mentionne jamais qu'un certificat SSL est requis pour utiliser l'API d'accès Paypal, cependant le code que j'utilise pour demander le jeton est le suivant:

$options = array(
                CURLOPT_URL => $url,
                CURLOPT_POST => 1,
                CURLOPT_VERBOSE => 1,
                CURLOPT_POSTFIELDS => $postvals,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_SSLVERSION => 3
);

curl_setopt_array($ch, $options);

$response = curl_exec($ch); 
echo curl_error($ch);

Cet écho génère l'erreur suivante:

SSL certificate problem: unable to get local issuer certificate

Mes questions sont:

1) Ai-je besoin de SSL pour utiliser l'accès Paypal si je n'ai besoin que de recevoir l'e-mail de l'utilisateur?

2) Si je n'ai pas besoin de SSL, pourquoi cette erreur se produit-elle?

PS: le point de terminaison est le suivant: https://www.sandbox.Paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

41
Luca Pennisi

La solution correcte consiste à corriger votre PHP .. définir CURLOPT_SSL_VERIFYPEER sur false est un hack rapide, mais c'est faux lorsque vous désactivez la validation du certificat par son autorité de certification. Cela vous expose à une attaque de l'homme du milieu.

Il est facile de corriger ( php 5.3.7 ou supérieur) - Télécharger un fichier de liste avec des autorités de certification à jour, et ajoutez ce paramètre à votre php.ini
curl.cainfo=<path-to>cacert.pem

Redémarrez votre serveur Web et cela fonctionnera!

120
oori

Vous pouvez désactiver la vérification SSL (qui est activée par défaut à partir de cURL 7.10), en ajoutant ceci:

CURLOPT_SSL_VERIFYPEER, false

à ton $options, cependant la bonne façon est de garder la validation activée.

AVIS DE SÉCURITÉ

Si le site distant utilise un certificat émis par une autorité de certification connue mais que la validation échoue toujours, alors le certificat est probablement mal configuré sur le serveur distant (manque de certificats intermédiaires, etc.). Alternativement, votre système n'a aucune idée de l'autorité de certification utilisée qui a signé le certificat de la cible. Dans ce cas, vous devez utiliser php.ini's curl.cainfo ( documentation ) pour pointer vers un fichier PEM valide avec toutes les autorités de certification prises en charge - ce qui rendrait votre configuration valider correctement la chaîne d'émetteurs.

Veuillez noter qu'en définissant CURLOPT_SSL_VERIFYPEER à false vous êtes [~ # ~] pas [~ # ~] à résoudre le problème! Vous travaillez autour. C'est une question de sécurité donc c'est bien de le faire pendant un moment, mais le déployer en production n'est pas sage, poliment parlant, car vous deviendrez ouvert à Man In The Middle Attack . Tu étais prévenu.

12
Marcin Orlowski

J'ai eu le même problème exact

Can't connect to Paypal to validate IPN message: SSL certificate: unable to get local issuer certificate

J'ai utilisé les exemples de code générés sur le github de Paypal trouvé ici (j'ai utilisé PHP): https://github.com/Paypal/ipn-code-samples

J'ai téléchargé les deux certificats et essayé de tester les deux à partir de curl: http://curl.haxx.se/docs/caextract.html

Après environ 2 heures de tests (à l'aide du simulateur d'ipn de Paypal) et de recherche sur Google, j'ai constaté que l'ipn de Paypal ne peut pas être testé sur localhost, j'ai donc poussé le code en direct et essayé de tester, mais j'ai toujours la même erreur (même avec des autorisations réglé sur 777).

Quand je mets CURLOPT_SSL_VERIFYPEER, false, cela a fonctionné, mais cela irait à l'encontre de l'objectif d'avoir un certificat SSL.

Après avoir fouillé les fichiers de mon serveur, j'ai trouvé un curl-ca-bundle.crt fichier dans mon dossier PHP. J'ai décidé de coder en dur le CURLOPT_CAINFO dans mon script ipn Paypal vers ce chemin. Cela a finalement fonctionné!

J'ai remarqué que cet ancien fichier .crt comprenait certains certificats qui n'étaient pas sur le dernier fichier .crt du site Web curl. C'était un tas de certificats de verisign class 1, verisign class 2, verisign class 3 and verisign class 4.

Voici la liste complète des noms de certificats que j'ai ajoutés au fichier .crt de curl:

  • Verisign Class 1 Public Primary Certification Authority
  • Verisign Class 1 Public Primary Certification Authority - G2
  • Verisign Class 1 Public Primary Certification Authority - G3
  • Verisign Class 2 Public Primary Certification Authority - G2
  • Verisign Class 2 Public Primary Certification Authority - G3
  • Verisign Class 3 Public Primary Certification Authority
  • Verisign Class 4 Public Primary Certification Authority - G2

Cela peut avoir quelque chose à voir avec ce que @Andomar disait - le certificat verisign de Paypal n'est pas inclus dans la liste par défaut (par défaut, je veux dire par défaut de curl) des certificats sécurisés.

Je n'ai pas eu le temps de déboguer et de déterminer exactement quel certificat est nécessaire, je les ai donc tous inclus.

Pour tous ceux qui rencontreront ce problème à l'avenir, je suggère d'obtenir les derniers certificats de curl et d'ajouter un par un les certificats dans la liste ci-dessus jusqu'à ce que l'erreur disparaisse.

Voici un lien pour certains de ces certificats verisign (vous devrez peut-être google pour les autres non répertoriés): www.symantec.com/page.jsp?id=roots

Remarque *: Pour afficher les certificats actuels de Paypal, vous pouvez exécuter cette commande dans le terminal:

openssl s_client -connect Paypal.com:443 -showcerts

Si quelqu'un a un aperçu supplémentaire de ce problème, veuillez commenter car j'ai passé des heures à comprendre tout ce qui précède.

5
Truchainz

Problème de certificat SSL: impossible d'obtenir le certificat d'émetteur local

Signifie que cUrl ne fait pas confiance à Verisign, l'autorité de certification qui se porte garant de Paypal. Comme Marc B le fait remarquer, cUrl n'est plus livré avec confiance pour aucune autorité de certification.

Vous pouvez contourner la validation de la chaîne de certificats avec l'option:

CURLOPT_SSL_VERIFYPEER => 0

Pour savoir comment configurer cUrl afin qu'il approuve Verisign, lisez documentation cUrl .

2
Andomar