Curl : Problème de certificat SSL, vérifier que le CA cert est OK
07 avril 2006
Lorsque vous ouvrez une url sécurisée avec Curl, vous pouvez obtenir l'erreur suivante :
Problème de certificat SSL, vérifiez que le certificat de l'autorité de certification est correct.
Je vais vous expliquer pourquoi cette erreur et ce que vous devez faire pour y remédier.
Le moyen le plus simple de se débarrasser de cette erreur serait d'ajouter les les deux lignes suivantes à votre script . Cette solution pose un risque de sécurité sécurité.
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
Voyons ce que font ces deux paramètres. Je cite le manuel.
CURLOPT_SSL_VERIFYHOST : 1 pour vérifier l'existence d'un nom commun dans le certificat SSL du pair. 2 pour vérifier l'existence d'un nom commun et vérifier également qu'il correspond au nom d'hôte fourni.
CURLOPT_SSL_VERIFYPEER : FALSE pour empêcher CURL de vérifier le certificat de l'homologue. D'autres certificats à vérifier peuvent être spécifiés être spécifiés avec l'option CURLOPT_CAINFO ou un répertoire de certificats peut être spécifié avec l'option CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST peut aussi avoir besoin d'être TRUE ou FALSE si CURLOPT_SSL_VERIFYPEER est désactivé (la valeur par défaut est 2). Réglage de CURLOPT_SSL_VERIFYHOST à 2 (c'est la valeur par défaut) permet de garantir que le certificat qui vous est présenté a un "nom commun" correspondant à l'URN correspondant à l'URN que vous utilisez pour accéder à la ressource distante. Il s'agit d'une un contrôle sain, mais il ne garantit pas que votre programme n'est pas trompé. ne soit pas trompé.
L'homme du milieu
Votre programme pourrait être induit en erreur en parlant à un autre serveur à la place. Ceci peut être réalisé à travers plusieurs mécanismes, comme le dns ou le arp poisoning (c'est une histoire pour un autre jour). L'intrus peut également signer lui-même un certificat avec le même "nom de domaine" que votre programme que votre programme attend. La communication serait toujours cryptée mais vous mais vous donneriez vos secrets à un imposteur. Ce type d'attaque est appelé "man in the middle".
Vaincre l'homme du milieu
Eh bien, nous avons besoin de vérifier que le certificat qui nous est présenté est bien réel. Nous le faisons en le comparant à un certificat auquel nous avons raisonnablement* confiance.
Si la ressource distante est protégée par un certificat émis par l'une des principales principales autorités de certification comme Verisign, GeoTrust et autres, vous pouvez comparer en toute sécurité. avec le paquet de certificats CA de Mozilla que vous pouvez obtenir à partir de http://curl.haxx.se/docs/caextract.html
Sauvegarder le fichier cacert.pem
quelque part dans votre serveur et définissez les les options suivantes dans votre script.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");