Comment générer un certificat SSL pour Nginx avec Let's Encrypt sous Ubuntu

Comment générer un certificat SSL pour Nginx avec Let's Encrypt sous Ubuntu

Introduction

Le protocole HTTPS garantit la sécurité des communications entre un navigateur et un site internet, c'est-à-dire la confidentialité, l'intégrité et l'authenticité des données échangées. Des informations peuvent donc être transmises sans aucun risque d'être interceptées ou modifiées, tout en étant sûr que le site avec lequel vous communiquez est réellement celui qu'il prétend être. C'est la raison pour laquelle HTTPS est crucial pour n'importe quel site web, surtout si des informations sensibles sont communiquées, comme des identifiants. Cette protection est obtenue par l'intégration du protocole HTTP et du protocole SSL.

L'un des éléments fondamentaux pour mettre en place le protocole HTTPS est un certificat SSL, il permet de garantir l'authenticité d'un serveur web. Il est délivré et signé cryptographiquement par une autorité de certification, suite à une vérification de l'identité et de la légitimité du propriétaire du site web.

Le protocole SSL (Secure Socket Layer) a été remplacé par le protocole TLS (Transport Layer Security) en 1995 en raison de failles de sécurité connues, mais l’abréviation "SSL" est resté et est encore utilisé aujourd'hui a la place de "TLS".

Qu'est ce que Let's Encrypt ?

Let's Encrypt (LE) est une autorité de certification créée le 18 novembre 2014 par l'ISRG (Internet Security Research Group). L'une des particularités majeures de Let's Encrypt est son processus de délivrance gratuit et automatisé de certificats. Contrairement aux méthodes traditionnelles qui nécessitaient des étapes manuelles et parfois coûteuses, Let's Encrypt a simplifié et automatisé le processus grâce à des outils tels que Certbot. Cela a permis aux propriétaires de sites web, même ceux ayant des ressources limitées, de mettre en place rapidement et facilement des connexions sécurisées pour leurs utilisateurs.

Let's Encrypt a joué un rôle important dans le développement de la sécurité en ligne en rendant les certificats SSL accessibles à n'importe quel site web, y compris les petits blogs comme celui sur lequel vous êtes actuellement.

L'un des avantages supplémentaires de Let's Encrypt est sa prise en charge pour le protocole ACME (Automatic Certificate Management Environment), qui facilite la gestion et le renouvellement automatisé des certificats. Les certificats SSL délivrés par Let's Encrypt ont une durée de validité plus courte (généralement 90 jours), mais elle encourage les propriétaires de sites web à garder leurs certificats à jour et à maintenir de bonnes pratiques de sécurité.

Ouverture du port HTTPS

Le protocole HTTP utilise le port 80/tcp, mais le protocole HTTPS utilise le port 443/tcp. Donc si vous utilisez un par-feu, vous devrez créer une règle afin de l'autoriser. Aussi, si votre serveur est derrière NAT, vous devrez mettre en place une Redirection de Port (Port Forwarding).

Générer un certificat SSL avec Certbot

Certbot est un outil open-source qui permet d’interagir avec Let's Encrypt afin de simplifier et d'automatiser le processus d'obtention, de renouvellement et de gestion des certificats SSL sur un serveur web. Pour installer la version Nginx de Certbot, vous pouvez utiliser cette commande.

sudo apt install python3-certbot-nginx

L'étape la plus importante du processus d'obtention d'un certificat SSL est la validation du domaine. Cette étape consiste a prouver que vous avez le contrôle sur le domaine pour lequel vous demandez un certificat. Pour cela, il existe plusieurs méthodes, notamment la validation HTTP, la validation DNS, ou encore la validation par email. Dans ce guide, je vais vous expliquer comment valider votre domaine en utilisant soit la méthode HTTP, soit la méthode DNS.

Si vous souhaitez générer un certificat couvrant plusieurs domaines, ou un certificat wildcard, c'est-à-dire un certificat qui s'applique à un domaine principal ainsi que tous ses sous-domaines, la méthode DNS est obligatoire.

Méthode 1 - Validation HTTP

Cette méthode est la plus simple et la plus rapide. De plus, elle permet le renouvellement automatique de vos certificat. Pour la mettre en place, il suffit que votre domaine pointe vers votre serveur et qu'il soit accessible par HTTP (sur le port 80).

Afin d'effectuer la validation du domaine, Certbot va démarrer un serveur HTTP temporaire sur votre machine. Ensuite, Let's Encrypt enverra une requête au domaine pour lequel vous demandez un certificat et vérifiera qu'il reçoit bien une réponse de Certbot. Pour démarrer le processus d'obtention du certificat, utilisez cette commande.

sudo certbot --nginx

Vous devrez commencer par renseigner votre adresse email. Elle sera utilisée afin de vous envoyer des alertes comme l'expiration imminente d'un certificat.

Adresse email

Vous devrez ensuite accepter les conditions d'utilisation de Let's Encrypt, que vous pouvez retrouver ici. Certbot vous demandera également si vous souhaitez abonner votre adresse email à la newsletter de l'EFF (Electronic Frontier Foundation). Finalement, vous devrez sélectionner pour quels domaines vous souhaitez générer un certificat. Si Certbot n'a trouvé aucun domaine dans les fichiers de configuration Nginx, vous devrez le ou les entrer manuellement.

Selection des domaines pour lesquels vous demandez un certificat

Un certificat devrait désormais avoir été créé. On peut voir que le certificat ainsi que la clé privée se situent dans le répertoire /etc/letsencrypt/live/domain.com/, et que le renouvellement automatique est activé.

Génération du certificat

Des modifications aux fichiers de configuration de votre serveur Nginx ont été apportées par Certbot afin de configurer HTTPS et de rediriger les requêtes HTTP vers HTTPS. Vous pouvez maintenant vous rendre sur votre site en utilisant HTTPS.

Méthode 2 - Validation DNS

La validation DNS prend un peut plus de temps, mais elle reste relativement simple. Pour utiliser cette méthode, il vous suffit d'avoir le contrôle des enregistrements DNS de votre domaine. Afin d'effectuer la validation, Certbot va simplement vous demander de prouver que vous êtes le propriétaire du domaine en ajoutant un ou plusieurs enregistrements DNS spéciaux.

Il est important de noter que la validation DNS nécessite une intervention manuelle, par conséquent le renouvellement automatique n'est pas activé par défaut. Dans la commande, utilisez l'option -d pour chaque domaine que vous voulez inclure dans le certificat. Vous pouvez utiliser des joker (*) afin de couvrir tous les sous-domaines directes d'un domaine principal. Par exemple -ddomaine.com couvre tous les sous domaines directes de domaine.com comme bonjour.domaine.com ou autre.domaine.com.

sudo certbot certonly \
    --manual \
    --preferred-challenges=dns \
    -d "domaine.com" \
    -d "test.domaine.com" \
    -d "autre.domaine.com"

Vous devrez entrer votre adresse email et répondre a quelques questions, puis le programme va vous demander d'ajouter un ou plusieurs enregistrements TXT a votre zone DNS. Lisez avec attention les instructions données par Certbot.

Configuration de Nginx

Contrairement à la méthode HTTP, lorsque vous utilisez la méthode DNS Certbot ne configurera pas automatiquement HTTPS sur votre serveur Nginx, vous devrez donc le faire manuellement.

sudo nano /etc/nginx/sites-available/ma_configuration.conf

Premièrement, ajoutez ce bloc serveur permet de rediriger les requêtes HTTP vers HTTPS.

server {
    # Décommentez cette ligne si vous
    # souhaitez également utiliser IPv6
    # listen [::]:80;
	
    listen 80;
    
    server_name example.com;
    return 301 https://$host$request_uri;
}

Ensuite modifiez votre bloc serveur existant pour qu'il utiliser HTTPS.

server { 
    # Décommentez cette ligne si vous
    # souhaitez également utiliser IPv6
    # listen [::]:443 ssl;
    
    # Vous devez faire écouter votre serveur 
    # sur le port HTTPS (443) et ajouter l'option "ssl"
    listen 443 ssl;
    
    server_name domaine.com;
    
    # Votre certificat SSL
    ssl_certificate /etc/letsencrypt/live/domaine.com/fullchain.pem; 
	
    # La clé privée de votre certificat
    ssl_certificate_key /etc/letsencrypt/live/domaine.com/privkey.pem;
	
    # Paramètres SSL générés par Certbot pour Nginx
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
    # Le reste de votre configuration
    # location / { ...
}

Conclusion

Si vous êtes arrivés jusqu'ici, alors votre site devrait désormais être équipé d'un certificat SSL et du protocole HTTPS. Si vous rencontrez un problème, n'hésitez pas a demander de l'aide dans les commentaires sous cet article et je serai ravi de vous aider!

Informations additionnelles