web-dev-qa-db-fra.com

lecture de la page SSL avec CURL (php)

J'essaie de télécharger le contenu d'une page Web sécurisée (utilise https) en utilisant les bibliothèques php et curl.

Cependant, la lecture a échoué et j'obtiens l'erreur 60: "Problème de certificat SSL, vérifiez que le certificat CA est OK."

également "Détails: SSL3_GET_SERVER_CERTIFICATE: la vérification du certificat a échoué"

Donc ... des messages d'erreur assez explicites.

Ma question est: comment envoyer un certificat SSL (le bon?) Et obtenir cette page pour le vérifier et me laisser entrer?

En outre, voici mon tableau d'options au cas où vous vous poseriez la question:

    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLOPT_SSL_VERIFYHOST => 1,
    );

Toutes les suggestions seraient formidables, Andrew

35
Andrew

Il semble que vous ayez mal interprété l'erreur. Il me semble que le site auquel vous vous connectez est auto-signé ou un autre problème courant. Tout comme l'avertissement habituel du navigateur, la solution la plus simple consiste à désactiver les vérifications.

Vous devrez définir CURLOPT_SSL_VERIFYPEER et CURLOPT_SSL_VERIFYHOST à FALSE. Cela devrait désactiver les deux contrôles principaux. Ils ne sont peut-être pas tous les deux nécessaires, mais cela devrait au moins vous aider à démarrer.

Pour être clair, cela désactive une fonctionnalité conçue pour vous protéger. Ne faites cela que si vous avez vérifié le certificat et le serveur par d'autres moyens.

Plus d'informations sur le site PHP: curl_setopt ()

51
Ryan Graham

Si vous souhaitez utiliser la vérification par les pairs SSL (la désactiver n'est pas toujours une bonne idée), vous pouvez utiliser la prochaine solution sur Windows globalement pour toutes les applications:

  1. Téléchargez le fichier avec les certificats racine à partir d'ici: http://curl.haxx.se/docs/caextract.html
  2. Ajoutez à php.ini:

curl.cainfo=C:/path/to/cacert.pem

c'est magique, CURL peut désormais vérifier les certificats.

(comme je sais qu'il n'y a pas un tel problème sur Linux, au moins sur Ubuntu)

22
WayFarer

Même après avoir suivi les conseils sur SO .. Vous pouvez toujours rencontrer des problèmes avec une erreur comme:

error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error

le problème vient de la version SSL. Utilisez ce qui suit pour la version 3

curl_setopt($ch, CURLOPT_SSLVERSION,3)

Je suppose que vous avez également activé la vérification de l'homologue et de l'hôte et que je pointe vers un fichier de certificat réel. Par exemple.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cacert.pem");
6
pkanane

Il s'agit d'un "problème" avec openssl et VeriSign.

J'ai eu un problème similaire et mon openssl manquait le certificat SSL intermédiaire utilisé par VeriSign pour signer le certificat du serveur.

https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657

J'ai dû importer ces certificats intermédiaires depuis la page d'accueil VeriSign ou Firefox cert-database-export dans ma liste de certificats locaux et après cette étape, j'ai pu utiliser wget/curl pour utiliser la connexion protégée sans aucune erreur.

2
Comradin

S'il s'agit d'une machine de développeur, vous pouvez également ajouter ce certificat dans votre système. Quelque chose comme ça - https://www.globalsign.com/support/intermediate/intermediate_windows.php C'est pour WinXP, mais cela fonctionne aussi sur d'autres versions de Windows.

C'est apparemment sur le bogue openssl. Tomcat peut être configuré pour contourner ce problème dans /etc/Tomcat7/server.xml en restreignant la liste de chiffrement disponible:

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>
0
Sreedhar GS

Vous n'envoyez pas le certificat SSL. Il semble qu'il y ait un problème avec le certificat SSL car il est installé sur l'hôte que vous contactez. Utilisez l'option -k ou --insecure pour dépasser la réclamation.

Ah. Voir la réponse de Ryan Graham

0
PartialOrder