Index | Archives | RSS

Obtenir un certificat HTTPS gratuitement avec LetsEncrypt

Temps de lecture estimé : 3min 40s

TD;DR

Pour les plus pressés, exéctuez ces commandes sur votre serveur en changeant le mail de contact et les domaines/sous-domaines que vous souhaitez protéger :

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --renew-by-default --standalone --agree-tos --email contact@mgaudin.fr -d mgaudin.fr -d blog.mgaudin.fr 

Votre certificat ainsi que la clef privée ont été générés dans le dossier suivant /etc/letsencrypt/live/VOTRE_DOMAIN_PRINCIPAL/.

Attention, il est nécessaire qu'aucun autre serveur n'écoute sur le port 80 pour que cela fonctionne.


Qu'est-ce qu'un certificat HTTPS ? À quoi ça sert ?

Un certificat HTTPS (X.509 en réalité mais passons) est un fichier faisant office de carte d'identité numérique. C'est ce certificat qui va nous permettre d'utiliser le protocole HTTPS avec nos utilisateurs.

Pour rappel, le protocole HTTPS permet deux choses :

  • Identifier avec certitude l'identitée du site
  • Chiffrer les échanges avec ce site web

En d'autres termes, lorsque votre navigateur préféré affiche un cadenas, vous savez que la connexion entre votre machine et le site web est chiffrée. Ni une personne de votre réseau local, ni vos FAI ne peuvent (théoriquement) lire le contenu de vos échanges.

S'il s'agit une bonne propriété pour la consultation d'un blog par exemple, c'est un prérequis dès que vous vous trouvez dans une des situations suivantes :

  • Vous devez vous authentifier sur le site : En HTTPS, vos authentifiants ne transitent pas en clair sur le réseau
  • Vous effectuez des achats sur internet : Idem avec vos données bancaires

Comment obtenir un certificat HTTPS

Jusqu'à l'année dernière, seules quelques options s'offraient à vous :

  • Acheter un certificat chez une autorité de certification : Ça peut être assez cher en fonction du nombre de sous-domaine que vous souhaitez protéger
  • Obtenir un certificat gratuitement avec l'achat de votre nom de domaine (e.g. chez Gandi) : Un bon début mais aucun sous-domaine n'était inclu
  • Tenter d'obtenir un certificat chez StartSSL mais pour avoir déjà tenté l'expérience, c'est la croix et la bannière

Bref, il fallait aligner les billets (entre 20€ et 600€ par an !). De plus, il fallait passer par une phase de validation parfois pénible (fichier txt sur le serveur, entrées DNS, vérification d'identité, bref, un plaisir).

Miraculeusement en 2015, LetsEncrypt est arrivé.

LetsEncrypt (our connections) !

Pour les citer :

LetsEncrypt est une autorité de certification gratuite, automatisée et ouverte

Et oui, tout ça ! Autrement dit, plus de paiement, plus de processus de validation à la mano en ajoutant des entrées DNS et pour couronner le tout, les protocoles de génération et de renouvellement des certificats sont open-source.

Bref le pied. Mais est-ce que c'est vraiment aussi simple que ça ? Oui.

La marche à suivre pour générer le certificat est on ne peut plus simple :

  1. Connectez vous sur votre serveur en SSH
  2. Assurez vous qu'aucun serveur web (e.g. Nginx ou Apache) n'écoute sur le port 80
  3. Exécutez les commandes suivantes (en remplaçant le mail et les domaines) :
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --renew-by-default --standalone --agree-tos --email contact@mgaudin.fr -d mgaudin.fr -d blog.mgaudin.fr 

Et voilà, je viens de générer un certificat HTTPS valide pour 4 mois (car LetsEncrypt est encore en béta) pour mgaudin.fr et son sous-domaine blog.mgaudin.fr. Ici, je n'ai utilisé que deux domaines mais j'aurai pu en mettre autant que je veux (en revanche, LetsEncrypt ne supporte pas encore les wildcards).

Les fichiers ont été générés dans le dossier suivant /etc/letsencrypt/live/mgaudin.fr/. Vous pouvez trouver 4 fichiers :

  • fullchain.pem : Il s'agit du certificat HTTPS que nous utiliserons (c'est la concatenation de root.pem et de chain.pem)
  • privkey.pem : Il s'agit de la clef privée utilisée pour signer le certificat. Il est nécessaire de la garder précieusement et de ne jamais la divulguer
  • chain.pem : C'est le certificat de notre serveur (pas intéressant dans le cadre de l'article)
  • cert.pem : C'est le certificat de l'autorité de certification (pas intéressant dans le cadre de l'article)

Bonus : Configuration Nginx

Maintenant que vous avez votre certificat, il est nécessaire de configurer votre serveur web. Voici la configuration Nginx que j'utilise pour ce blog :

server {
    listen          80;
    server_name     blog.mgaudin.fr;

    # On force la redirection pour que l'utilisateur soit 
    # obligé d'utiliser HTTPS
    return          302 https://$server_name$request_uri;
}

server {
    # Si votre version de Nginx n'est pas assez récente, désactivez http2
    listen 443 ssl http2;
    server_name blog.mgaudin.fr;
    root /var/www/blog;

    # Configuration HTTPS
    ssl on;
    ssl_certificate /etc/letsencrypt/live/mgaudin.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mgaudin.fr/privkey.pem;

    location / {
        try_files $uri.htm $uri.html $uri =404;
    }
}

And voilà !


Qu'est-ce qu'un certificat HTTPS ? Pourquoi ? Comment l'obtenir gratuitement avec LetsEncrypt ? Voici la marche à suivre, étape par étape...

© Maxime Gaudin. Built using Pelican. Theme by Giulio Fidente on github.