Implémenter TLS/SSL en Python
Kingsley Ubah
16 octobre 2022
0 minutes de lectureAujourd’hui, nous faisons presque tout en ligne : réserver des vols, payer des biens, transférer de l’argent, envoyer des messages à nos proches, stocker des documents, et bien plus encore. Beaucoup de ces activités nécessitent de communiquer des informations sensibles, comme les données de carte bancaire et les coordonnées bancaires. Si un site web utilise un réseau non sécurisé, un pirate malveillant peut facilement voler les informations des utilisateurs. C’est pourquoi le chiffrement est si important.
Le protocole TLS (Transport Layer Security) est la meilleure protection des informations des utilisateurs sur les sites web et les applications web. TLS utilise un algorithme cryptographique difficile à déchiffrer, qui garantit que seul le serveur web et le client web peuvent lire ou modifier les données transmises.
Dans cet article, nous allons découvrir TLS et voir comment utiliser Python pour vérifier la validité du certificat TLS d’un site web. Nous vous guiderons ensuite à travers les étapes pour ajouter TLS à votre application Python sous Linux.
Comprendre TLS/SSL
Le protocole TLS, qui succède au protocole SSL (Secure Sockets Layer), protège les données grâce au chiffrement. Lorsque les utilisateurs envoient leurs informations à un site web, TLS les chiffre avant leur transmission. Seul le serveur disposant de la même clé publique que le client peut alors ouvrir le message. Cette règle s’applique également lorsque le serveur renvoie des informations au client. Seul le client possédant la clé correspondante peut lire les données.
Pour qu’un site web utilise le protocole TLS, vous devez installer un certificat TLS/SSL valide (souvent appelé certificat SSL). Une fois le certificat installé, le site passe de HTTP à HTTPS, un protocole de transfert plus sécurisé. Le certificat est un fichier de données qui contient l’identité du site web et la clé publique permettant d’ouvrir les messages transmis.
Un certificat SSL doit être valide pour fonctionner. Cela signifie qu’il doit être signé par une autorité de certification (AC) reconnue et qu’il doit être actif. Chaque certificat comporte une date d’émission et une date d’expiration. Après cette dernière, il n’est plus valide.
Les sites web qui ne possèdent pas de certificat SSL valide présentent quelques signes visibles. Par exemple, l’URL dans la barre d’adresse commence par HTTP:// au lieu de HTTPS://. De plus, aucun cadenas — utilisé par les navigateurs pour indiquer qu’un site est sécurisé — n’apparaît à côté de l’URL. Soyez prudent quant aux informations que vous communiquez si vous remarquez l’un de ces signes.
Maintenant que nous avons découvert TLS sur SSL (TLS/SSL), voyons comment l’implémenter avec Python.
Utiliser TLS/SSL en Python
Lorsque vous créez un serveur web avec Python, il est essentiel de savoir comment ajouter TLS/SSL à votre application. Avant de voir comment procéder, découvrons comment utiliser Python pour vérifier la validité du certificat SSL d’un site web.
Vérifier si un site web possède un certificat SSL valide
Pour vérifier la validité du certificat SSL d’un site web, il suffit d’exécuter un script Python comme celui-ci :
Le code ci-dessus importe le module Python requests et l’utilise pour envoyer une requête GET au site web Twitter. (Pour exécuter le script, vous devez installer le module requests en Python à l’aide de pip.) Vous pouvez remplacer l’URL de Twitter par celle du site web dont vous souhaitez vérifier le certificat SSL. La variable response stocke la valeur reçue, que le code affiche sur la dernière ligne.
À l’exécution du code, nous obtenons le message <Response [200]> (OK), ce qui signifie que le site Twitter utilise un certificat SSL valide, comme prévu.
Nous envoyons maintenant une requête GET à un autre site web, dont nous savons qu’il ne possède pas de certificat SSL valide.
Cette fois, nous recevons une erreur indiquant que la vérification du certificat a échoué :
La bibliothèque SSL de Python
Nous utilisons la bibliothèque SSL de Python pour chiffrer les communications TLS par socket entre les clients et les serveurs Python. Elle s’appuie sur la cryptographie et les condensés de messages pour sécuriser les données et détecter les tentatives de modification sur le réseau. Les certificats numériques assurent l’authentification.
La bibliothèque SSL est compatible avec Windows, macOS et les autres systèmes UNIX modernes. Elle nécessite également OpenSSL pour fonctionner.
Vers la fin de cet article, nous utiliserons la bibliothèque SSL de Python pour encapsuler notre socket de connexion à l’aide du certificat SSL que nous allons générer dans la section suivante.
Créer un certificat SSL auto-signé en Python
Maintenant que nous savons vérifier la validité de TLS/SSL sur un site web, voyons comment l’utiliser sur un serveur web Python.
Vous pouvez générer rapidement un certificat auto-signé gratuit et l’utiliser pour le développement local. Toutefois, si vous prévoyez de déployer le site ou l’application sur Internet, vous devez acheter un certificat SSL auprès d’un bureau d’enregistrement de noms de domaine de confiance (comme GoDaddy ou NameCheap).
La génération d’un certificat SSL pour votre application Python locale comporte trois étapes :
Créer la clé privée RSA.
Générer une demande de signature de certificat (CSR) à l’aide de la clé privée.
Signer la demande CSR pour créer le certificat.
Après avoir créé le certificat SSL, nous l’utiliserons dans une application Python pour effectuer des requêtes API.
Encore une fois, veillez à acheter un certificat SSL uniquement auprès d’une autorité de certification agréée. De nombreux bureaux d’enregistrement de noms de domaine incluent un certificat SSL gratuit lors de l’achat d’un domaine.
C’est parti !
Prérequis : installer OpenSSL sous Linux
Si vous utilisez Linux, OpenSSL est probablement déjà installé sur votre machine. Sinon, vous pouvez l’installer à l’aide de votre gestionnaire de paquets. La commande suivante installe OpenSSL sur les distributions basées sur Debian et Ubuntu :
Si vous ne savez pas si OpenSSL est déjà installé sur votre machine, vérifiez-le en exécutant la commande suivante :
Si OpenSSL est installé, la commande affiche son numéro de version. Si, en revanche, vous obtenez une erreur indiquant que la commande n’est pas reconnue, vous devez l’installer.
Créer la clé privée
Vous pouvez créer la clé privée avec ou sans phrase secrète de protection. Pour ajouter une phrase secrète, il suffit d’utiliser un chiffrement dans la commande, comme -aes256.
Les deux options ci-dessous génèrent une clé privée RSA de 2 048 bits, mais la première crée la clé sans phrase secrète.
Créer la CSR à l’aide de la clé
À cette étape, nous utilisons la clé privée générée précédemment pour créer une CSR. Pour ce faire, exécutez la commande suivante :
Vous devez saisir des informations supplémentaires sur le certificat dans la ligne de commande. Renseignez-les, puis appuyez sur Entrée.
Signer le certificat avec la clé
Dernière étape : signer la demande pour créer le certificat. Exécutez la commande suivante :
Ici, nous signons la demande de certificat avec la même clé que celle utilisée pour la créer. C’est pourquoi on parle de certificat « auto-signé ».
Vous pouvez afficher les détails du certificat en exécutant la commande suivante :
Exécuter un serveur HTTPS Python avec TLS/SSL
Maintenant que nous avons généré un certificat auto-signé, nous l’utilisons pour créer un serveur HTTPS qui chiffre toutes les communications avec un client à l’aide de TLS.
Le programme Python ci-dessous démarre un serveur HTTPS sur votre hôte local, au port 443.
Dans le code ci-dessus, nous avons importé les modules ssl et http.server modules. Nous avons ensuite appelé la méthode HTTPServer sur http.server, en lui transmettant l’adresse et le numéro de port du serveur. Nous avons ensuite encapsulé la socket avec SSL en indiquant le chemin d’accès à notre certificat dans la méthode wrap_socket. Enfin, nous avons démarré le serveur à la fin du fichier.
Pour connecter un client, vous pouvez utiliser le module Python requests afin d’envoyer une requête GET à l’adresse du serveur :
Notez que le code ci-dessus doit être placé dans un fichier distinct de celui du serveur. Son exécution doit connecter le client au serveur et renvoyer le message [200] (OK) :
En résumé
Dans cet article, nous avons découvert TLS/SSL et l’importance d’utiliser un certificat numérique valide sur nos sites web. Nous avons également vu comment vérifier le SSL d’un site web à l’aide de la méthode requests.get.
Nous avons ensuite présenté la bibliothèque SSL de Python et détaillé la création et l’utilisation d’un serveur web Python sécurisé par TLS/SSL. Nous avons généré un certificat auto-signé avec OpenSSL, puis ajouté ce certificat à notre connexion par socket HTTP avant de démarrer le serveur.
À mesure que le volume des transactions en ligne augmente, la cybercriminalité ne cesse de gagner en ampleur et en complexité. L’utilisation de certificats SSL sur vos sites web permet non seulement de déjouer la plupart des tentatives de piratage, mais aussi de renforcer la confiance des visiteurs. Consultez cet article pour en savoir plus sur les raisons d’utiliser HTTPS.
