64 votes

Impossible de se connecter à un site HTTPS avec cURL. Le site renvoie un contenu de longueur 0. Que puis-je faire ?

J'ai un site qui se connecte par cURL (dernière version) à une passerelle sécurisée pour le paiement.

Le problème est que cURL renvoie toujours un contenu de longueur 0. Je n'obtiens que des en-têtes. Et seulement lorsque je configure cURL pour qu'il renvoie des en-têtes. J'ai mis en place les drapeaux suivants.

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $gatewayURI);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, 1);

L'en-tête renvoyé est

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Tue, 25 Nov 2008 01:08:34 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 0
Content-Type: text/html
Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
Cache-control: private

J'ai également essayé d'accéder par cURL à différents sites et ils renvoient le contenu sans problème. Je pense que le problème pourrait avoir quelque chose à voir avec la connexion https.

J'ai parlé avec l'entreprise et ils sont peu serviables.

Quelqu'un d'autre a-t-il rencontré cette erreur et connaît-il un moyen de la contourner ? Devrais-je laisser tomber cURL et essayer d'utiliser fsockopen() ?

Merci. :)

100voto

SchizoDuckie Points 6420

J'ai eu le même problème aujourd'hui. Curl est livré avec un fichier obsolète pour authentifier les certificats HTTPS.

pour obtenir le nouveau :

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

enregistrez-le dans un répertoire sur votre site

et ajouter

curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 

A chaque demande :-)

IGNOREZ tous les commentaires stupides concernant la désactivation de CURLOPT_VERIFYPEER et de CURLOPT_VERIFYHOST ! Cela laisse votre code vulnérable aux attaques de type "man in the middle" !

Édition de décembre 2016 :

Résolvez ce problème correctement en utilisant la méthode de Jasen mentionnée ci-dessous.

ajouter curl.cainfo=/etc/ssl/certs/ca-certificates.crt dans votre php.dans

Edition d'octobre 2017 :

Il existe désormais un paquet composer qui vous aide à gérer les certificats ca, afin que vous ne soyez pas vulnérable si votre cacert.pem devient obsolète en raison de la révocation de certificats.

https://github.com/paragonie/certainty -> composer require paragonie/certainty:dev-master

1 votes

Cela semblait prometteur mais ça n'a pas marché :( Avez-vous d'autres idées ?

2 votes

Désactivez vos propres appels veryfipeer et verifyhost. Vous les avez dans l'exemple de code dans votre post. Ils doivent être activés !

0 votes

J'ai essayé... est-ce que le serveur sur lequel vous avez fait un cURL ne renvoie aussi que les en-têtes avec content-length : 0 ? Cela me rend fou....

35voto

too much php Points 27983

Vous devriez également essayer de vérifier les messages d'erreur dans curl_error(). Vous devrez peut-être le faire une fois après chaque fonction curl_*.

http://www.php.net/curl_error

1 votes

Génial. merci. cela a révélé mon problème. je l'ai résolu en utilisant la solution de SchizoDuckie.

28voto

mixdev Points 924

Note : Ce document n'est pas destiné à la production. Si vous voulez déboguer rapidement, cela peut être utile. Sinon, veuillez utiliser la réponse de @SchizoDuckie ci-dessus.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

Il suffit de les ajouter. Ça marche.

4 votes

Ça a marché pour moi. Je ne comprends pas les votes négatifs obtenus par @mixdev.

0 votes

Ça ne marchait toujours pas pour moi jusqu'à ce que j'ajoute curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); Maintenant, il fonctionne bien.

6voto

Cobra_Fast Points 5531

Je viens d'avoir un problème très similaire et je l'ai résolu en ajoutant

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Apparemment, le site que je récupère redirige vers un autre endroit et php-curl ne suit pas les redirections par défaut.

4voto

user203319 Points 31

J'ai eu une situation où cela m'a aidé : (PHP 5.4.16 sous Windows)

curl_setopt($ch, CURLOPT_SSLVERSION, 3);

1 votes

Curl_setopt($ch, CURLOPT_URL, $url) ; curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false) ; curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0) ; curl_setopt($ch, CURLOPT_SSLVERSION, 3) ; ça marche comme sur des roulettes, merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X