Problèmes du SSL avec la librairie cURL.

mieux protéger une application internet

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
La connexion cURL à une application cachée derrière SSL peut parfois poser pas mal de problèmes. Les messages du type "SSL certificate problem, verify that the CA cert is OK." sont, certes, perturbantes, mais pas difficiles à faire disparaître.

Pourquoi ce message ?
A cause de la confiance. cURL a été conçu pour ne pas faire confiance à aucune Autorité de Certification (CA). Depuis la version 7.18.0 de la librairie, aucun certificat n'est donc pas joint aux appels vers les protocoles HTTPS et FTPS.

cURL contient les options qui permettent la manipulation facile des éléments liés à SSL. C'est en jouant avec elles qu'on peut régler le problème soit rapidement, soit correctement.

Solution rapide
Pour résoudre le problème rapidement on doit paramétrer les options CURLOPT_SSL_VERIFYHOST et CURLOPT_SSL_VERIFYPEER. La première s'occupe de vérifier si le nom de l'hôte appelée est répertorié dans le fichier contenant les certificats. La deuxième option détermine si la validation du certificat doit être effectuée.

Si l'on veut régler le problème rapidement, il suffit de mettre ces deux options en false, commme ici :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);


Cependant, l'encryptage de la communication ne sera pas compromis.

Pourquoi rapide n'est pas correct ?
Cependant cette fix rapide n'est pas totalement sécurisé. Il est suffisant pour les données insensibles. Mais quand il s'agit par exemple d'une communication contenant les mots de passe, cette solution peut poser de sérieux problèmes de sécurité.

La non-validation du certificat peut compromettre l'échange entre les deux serveurs. Cela peut mener à l'attaque man-in-the-middle. Vu qu'on ne vérifie plus avec qui communique notre application, une troisième personne peut s'introduire dans l'échange et imiter le rôle de l'interlocuteur.

Alors il suffit que l'attaquant intercepte les données et les utilise pour, par exemple, faire une opération financière via l'API de notre service.

Solution correcte
Afin de résoudre le souci correctement on doit employer d'autres options disponibles dans la librairie cURL. Il s'agit de CURLOPT_CAINFO ou CURLOPT_CAPATH. Grâce à elles un développeur peut imiter le même comportement que celui adopté par les navigateurs.

En fait, les navigateurs stockent la liste contenant les certificats auxquels ils peuvent faire confiance. D'où les comportements différents par rapport à des certificats. Dans la situation où un certificat est présent dans ce fichier, le navigateur affiche par défaut une couleur (bleu, vert) qui correspond au niveau de sécurité. Dans le cas contraire, où le certificat ne fait pas partie de la liste, le navigateur demande l'utilisateur s'il veut faire confiance à la connexion.

Pour imiter la même technique dans cURL, il suffit de déterminer le chemin soit vers le fichier avec le certificat, soit vers le répertoire contenant les certificats. L'option CURLOPT_CAINFO est utilisé pour le fichier et CURLOPT_CAPATH pour le dossier. Voici l'exemple :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/ca/ca-bundle.crt');
curl_setopt($ch, CURLOPT_CAPATH, dirname(__FILE__).'/ca/');


Afin de récupérer le fichier contenant les certificats, on peut procéder selon les instructions données par les développeurs du cURL. La liste des certificats est actualisée une fois par semaine. La récupération ne doit pas être manuelle. L'automatisation passe par la récupération d'un script écrit en Perl.

Pour savoir un peu plus sur l'utilisation de la librairie cURL, je vous conseille vivement d'aller voir la documentation de cette librairie.

L'article écrit en rythme de:
Slaï - 3'30
Bartosz KONIECZNY 27-11-2011 12:16 sécurité des applications web
Un conseil Symfony2

Comment récupérer tous les paramètres ?

Pour récupérer tous les paramètres dans Symfony2, il faut appeler la méthode $request->request->all() (où $request est l'instance de la classe Symfony\Component\HttpFoundation\Request.