Curl: problème de certificat SSL, vérifiez que le certificat CA 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 CA est OK
Je vais vous expliquer pourquoi l'erreur et ce que vous devez faire à ce sujet.
Le moyen le plus simple de se débarrasser de l'erreur serait d'ajouter les deux lignes suivantes à votre script. Cette solution pose un risque pour la 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. Citant le manuel.
CURLOPT_SSL_VERIFYHOST : 1 pour vérifier l'existence d'un nom commun dans le certificat d'homologue SSL. 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 avec l'option CURLOPT_CAINFO ou un répertoire de certificats peut être spécifié avec l'option CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST peut également avoir besoin d'être VRAI ou FAUX si CURLOPT_SSL_VERIFYPEER est désactivé (il est par défaut 2). La définition de CURLOPT_SSL_VERIFYHOST sur 2 (il s'agit de la valeur par défaut) garantira que le certificat qui vous est présenté a un «nom commun» correspondant à l'URN que vous utilisez pour accéder à la ressource distante. Il s'agit d'une vérification saine, mais cela ne garantit pas que votre programme n'est pas trompé.
Entrez l'homme au milieu
Votre programme pourrait être induit en erreur en parlant à un autre serveur à la place. Cela peut être réalisé grâce à plusieurs mécanismes, comme le DNS ou l'empoisonnement par arp (c'est une histoire pour un autre jour). L'intrus peut également auto-signer un certificat avec le même «nom commun» que votre programme attend. La communication serait toujours cryptée mais vous confieriez vos secrets à un imposteur. Ce type d'attaque est appelé «l'homme au milieu»
Vaincre «l'homme au milieu»
Eh bien, nous devons vérifier que le certificat qui nous est présenté est bien réel. Nous le faisons en le comparant à un certificat auquel nous faisons confiance *.
Si la ressource distante est protégée par un certificat émis par l'une des principales autorités de certification comme Verisign, GeoTrust et al, vous pouvez comparer en toute sécurité le paquet de certificats de l'autorité de certification de Mozilla que vous pouvez obtenir sur
http://curl.haxx.se/docs/caextract .html
Enregistrez le fichier cacert.pem
quelque part sur votre serveur et définissez les options suivantes dans votre script.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");