web-dev-qa-db-fra.com

La requête Curl échoue sur le SSL?

J'ai ce code

    if(ereg("^(https)",$url))
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    // execute, and log the result to curl_put.log
    $result = curl_exec($curl);


    $error = curl_error($curl);

L'erreur spécifiée est 

SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

Des idées sur la cause

19
Matt Elhotiby

Avec SSL, assurez-vous que vous avez activé l’extension openssl depuis php.ini.

12
Sarfraz

J'ai rencontré une erreur cryptique similaire lorsque je travaillais avec une bibliothèque tierce. J'ai essayé le CURLOPT_SSL_VERIFY[PEER|Host] mais cela ne faisait aucune différence. Mon message d'erreur était similaire:

SSL read: error:00000000:lib(0):func(0):reason(0), errno 54

J'ai donc visité http://curl.haxx.se/libcurl/c/libcurl-errors.html , à la recherche du code d'erreur 54. 

CURLE_SSL_ENGINE_SETFAILED (54) Failed setting the selected SSL crypto engine as default!

C'était faux cependant - je faisais d'autres demandes HTTPS en utilisant curl dans d'autres parties de l'application. Alors j'ai continué à creuser et j'ai trouvé cette question, R & RCurl: Erreur 54 dans libcurl , qui contenait ce petit bijou:

La sortie que vous voyez provient de lib/ssluse.c dans le code source de libcurl et le "errno" mentionné ici ne correspond pas au code d'erreur libcurl, mais à la variable errno réelle à ce moment-là.

Donc, ne laissez pas la sortie de curl_error () vous induire en erreur. À la place, utilisez curl_errno () pour obtenir le code d’erreur correct, qui dans ce cas était réellement 56, CURLE_RECV_ERROR. Avait le mauvais nom d'hôte ...

30
Nick Caballero

J'ai eu le même problème. Il s'est avéré que le fichier SSL sur le système cible avait une mauvaise configuration.

Après avoir vérifié le module php curl, la version de GuzzleHttp, la version de openssl, j’ai appelé le lien dans le navigateur et cela a fonctionné. Mais avec curl --tlsv1 -kv https://www.example.com sur la console, il restait une erreur.

Donc, j'ai vérifié la configuration ssl à https://www.ssllabs.com/ssltest/ Il a été évalué avec B. Et là où certaines erreurs OCSP (Online Certificate Status Protocol) que je n'ai jamais vues auparavant. Enfin, j'ai modifié ma configuration sur le système cible pour prendre en compte les suggestions de https://cipherli.st/ , j'ai redémarré le serveur Web et tout a fonctionné. La nouvelle note chez ssllabs est maintenant A +.

Ma configuration nginx (Ubuntu 14.04, nginx 1.4.6-1ubuntu3.5):

ssl     on;
ssl_certificate /etc/ssl/certs/1_www.example.com_bundle.crt;
ssl_certificate_key     /etc/ssl/private/www.example.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
#ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify off; # Requires nginx => 1.3.7
ssl_dhparam /etc/ssl/private/dhparams.pem;
ssl_trusted_certificate /etc/ssl/startssl.ca.pem;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; www.example.com; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
1
Markus D.

J'ai eu la même erreur imprimée par la fonction curl_error mais ce n'est pas nécessairement lié à SSL. Il vaut mieux imprimer le numéro d'erreur exact avec la fonction curl_errno et mieux diagnostiquer à partir de là. Dans mon cas, il m'a renvoyé un code d'erreur 52 et j'ai pu déboguer à partir de là, en fait, l'autre serveur n'envoyait aucune donnée.

0
eloone

ajoute ça:

curl_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, 0);

J'ai eu la même erreur et a bien fonctionné pour moi.

0
jacktrade