2013-07-04 3 views
40

Je travaille avec cURL et PHP pour faire une demande à un serveur (pour l'accès paypal)Paypal Accès - certificat SSL: impossible d'obtenir le certificat d'émetteur locale

Paypal site de développeur ne mentionne jamais qu'un certificat SSL est nécessaire pour utiliser l'API d'accès PayPal, mais 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'email de l'utilisateur?

2) si je n'ai pas besoin de SSL, pourquoi cette erreur apparaît-elle?

PS: le point final est le suivant: https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

Répondre

2

SSL certificate problem: unable to get local issuer certificate

Signifie que CURL ne fait pas confiance Verisign, l'autorité de certification qui authentifie PayPal. Comme le remarque Marc B, cUrl n'est plus livré avec l'approbation d'aucune autorité de certification.

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

CURLOPT_SSL_VERIFYPEER => 0 

Pour lire comment configurer CURL afin qu'il fait confiance à Verisign, lire le cUrl documentation.

+2

pas vraiment étrange. curl n'est plus livré avec les certificats CA, donc par défaut, il ne fait confiance à personne. –

+0

@MarcB: Intéressant, je supposais qu'il utilisait le magasin de certificats du système d'exploitation. – Andomar

+3

ce serait bien, mais étant donné le nombre d'endroits où ce magasin est conservé, probablement le meilleur pour boucler juste aller paranoïaque et penser que tout le monde est dehors pour l'obtenir. –

12

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

CURLOPT_SSL_VERIFYPEER, false 

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

SÉCURITÉ AVIS

Si un site distant utilise certificat délivré par CA connu, mais la validation échoue encore, alors le certificat le plus probable est correctement mis en place sur le serveur distant (manque de certificats intermédiaires, etc.). Sinon, 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 le de php.ini (documentation) pour pointer vers un fichier PEM valide avec toutes les autorités de certification prises en charge, afin que votre configuration valide correctement la chaîne de l'émetteur.

Veuillez noter qu'en réglant CURLOPT_SSL_VERIFYPEER à false vous êtes pas résoudre le problème! Vous travaillez autour. Tout est une question de sécurité, alors c'est bien de le faire pendant un certain temps, mais déployer cela en production n'est pas sage, poliment parlant, car vous serez ouvert à Man In The Middle Attack. Tu étais prévenu.

+1

Merci !!!!!! –

+15

-1, S'ouvrir à un MITM n'est pas la bonne réponse. –

+2

Oui, c'est un mauvais hack en quelque sorte !!! – Chiragit007

115

La solution correcte est de fixer votre configuration PHP .. CURLOPT_SSL_VERIFYPEER false est un hack rapide, mais il est faux que vous désactivez la validation du certificat par son autorité de certification. Cela vous expose à une attaque d'homme dans le milieu.

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

Redémarrez votre serveur Web, et ça va fonctionner!

+0

J'avais déjà un fichier similaire situé à /etc/ssl/certs/ca-certificates.crt (distribution Gentoo Linux). –

+3

A travaillé pour moi sur mon installation de serveur WAMP. Je vous remercie. –

+10

Vous pouvez également spécifier le certificat à l'exécution: 'curl_setopt ($ ch, CURLOPT_CAINFO, '/path/to/cacert.pem')'. Maintenant, vous n'avez aucune excuse pour désactiver la vérification! –

5

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

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

je les exemples de code générés ici github de paypal trouvé (je PHP): https://github.com/paypal/ipn-code-samples

J'ai téléchargé les certs et ont essayé de tester à la fois de boucles: Après environ 2 heures de tests (en utilisant le simulateur ipn de paypal) et googling, j'ai trouvé que paypal ipn ne peut pas être testé sur localhost, donc j'ai poussé le code en direct et j'ai essayé le testin g, mais toujours la même erreur (même avec les permissions définies sur 777).

Lorsque j'ai défini CURLOPT_SSL_VERIFYPEER, false, cela a fonctionné, mais cela annulerait le but d'avoir un certificat ssl. Après avoir scruté les fichiers de mon serveur, j'ai trouvé un fichier curl-ca-bundle.crt dans mon dossier PHP. J'ai décidé de coder en dur le CURLOPT_CAINFO dans mon script paypal ipn à ce chemin. Ça a finalement marché! J'ai remarqué que ce fichier .crt plus ancien contenait des certificats qui ne figuraient pas dans 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.

est ici la liste complète des noms de certificat, j'ai ajouté à friser de .CRT fichier:

  • Verisign classe 1 Autorité de certification primaire publique
  • Verisign classe 1 Autorité de certification primaire publique - G2
  • Verisign classe 1 Autorité de certification publique principale - G3
  • Autorité de certification publique principale Verisign Classe 2 - G2
  • Verisign Certi fication Autorité - G3
  • Verisign de classe 3 Autorité de certification primaire publique
  • Verisign classe 4 Autorité de certification primaire publique - G2

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

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

Pour tous ceux qui rencontreraient ce problème dans le futur, je suggérerais d'obtenir les derniers certs de curl et d'ajouter un par un les certificats dans la liste ci-dessus jusqu'à ce que l'erreur soit partie.

est ici un lien pour certains de ces certificats verisign (vous devrez peut-être google pour les autres qui ne figurent pas): www.symantec.com/page.jsp?id=roots

* Note: Pour afficher le courant de paypal certificats que vous pouvez exécuter cette commande dans le terminal:

openssl s_client -connect paypal.com:443 -showcerts 

Si quelqu'un a un meilleur aperçu de cette question, s'il vous plaît commentaires que je passais des heures à comprendre tous les PRÉCÉDENTES.

+1

J'ai été en mesure de résoudre le problème en ajoutant Verisign Class 3 Public Primary CA à partir de http://www.symantec.com/content/en/us/enterprise/verisign/roots/Class-3-Public-Primary-Certification-Authority .pem - donc apparemment c'est le manquant. – DiMono