Tutoriels

Tuto : certificat SSL gratuit avec Let’s Encrypt

Header Let's Encrypt

Nous allons voir dans ce tutoriel comment mettre en place un certificat SSL Let’s Encrypt sur son serveur Debian. Nous verrons ensuite comment configurer nginx pour que nos certificats soit automatiquement renouvelés à l’issue de leur 90 jours de validité.

Configuration de base de nginx

Nous allons commencer par ajouter un nouveau host dans notre configuration nginx pour que Let’s Encrypt puisse générer les certificats automatiquement. Ce fichier doit être appelé en premier lors du lancement du serveur web, je vous conseille donc de le nommer en 0-letsencrypt.conf. La configuration contenue dans ce fichier permet au client Let’s Encrypt de créer un « challenge » afin de vérifier la redirection DNS et l’identité du serveur.

On créer donc le fichier de configuration :

nano /etc/nginx/sites-enabled/0-letsencrypt.conf

On y colle le contenu suivant (pensez à modifier votre nom de domaine) :

server {
  listen              80;
  listen              [::]:80;
  server_name         domain.tld;
  location '/.well-known/acme-challenge' {
        default_type "text/plain";
        root        /var/www;
  }
  location / {
    return              301 https://$server_name$request_uri;
  }
}

On termine en relançant nginx :

service nginx restart

Nginx est maintenant configuré pour pouvoir répondre correctement aux requêtes qui seront émises par Let’s Encrypt.

Génération du certificat

Nous allons maintenant installer le client Let’s Encrypt sur notre serveur et générer le certificat avec le mode automatique. Pour cela, on va commencer par récupérer les fichiers de Let’s Encrypt après avoir installé les dépendances nécessaires :

apt-get -y install git bc
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Une fois cela fait, on peut lancer la génération de notre certificat (pensez à modifier votre nom de domaine) :

/opt/letsencrypt/letsencrypt-auto certonly --rsa-key-size 4096 --webroot --webroot-path /var/www -d domaine.tld

Si tout se passe bien, vous devriez obtenir un message de félicitations vous indiquant que votre certificat a bien été généré. Nous allons maintenant pouvoir mettre en place le renouvellement automatique du certificat grâce à une simple tâche Cron :

crontab -e

Et on y ajoute cette ligne :

30 3 * * 0 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt/renewal.log

Et c’est tout ! Désormais, le certificat que nous venons de générer sera automatiquement renouvelé lorsque qu’il arrivera à quelques jours de date d’expiration. Vous n’avez donc plus à vous soucier du renouvellement de vos certificats.

Utilisation du certificat avec nginx

Les fichiers générés par Let’s Encrypt sont placés dans le répertoire /etc/letsencrypt.
Si tout s’est bien passé, le certificat et la clé que vous venez de générer se trouve donc dans /etc/letsencrypt/live/domain.tld.

Exemple :

lrwxrwxrwx 1 root root 45 Nov  4 08:34 cert.pem -> ../../archive/domain.tld/cert1.pem
lrwxrwxrwx 1 root root 46 Nov  4 08:34 chain.pem -> ../../archive/domain.tld/chain1.pem
lrwxrwxrwx 1 root root 50 Nov  4 08:34 fullchain.pem -> ../../archive/domain.tld/fullchain1.pem
lrwxrwxrwx 1 root root 48 Nov  4 08:34 privkey.pem -> ../../archive/domain.tld/privkey1.pem

Ce qui nous intéresse ici ce sont ces deux fichiers : fullchain.pem et privkey.pem.

Voici un exemple de configuration SSL pour nginx (à intégrer dans votre vhost ou dans un fichier à part). C’est la configuration utilisée pour ce site et qui assure une bonne compatibilité en plus de l’utilisation de protocoles robustes.

    ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    ssl_ecdh_curve secp384r1;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA";

    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;  # à supprimer si vous souhaitez être indexé par Google

    ssl_stapling on;
    ssl_stapling_verify on;

    resolver 8.8.8.8;
service nginx restart

Votre site est désormais accessible en HTTPS avec un joli certificat SSL/TLS. Vous pouvez tester que tout est OK sur CryptCheck ou Qualys. Vous devriez, dans les deux cas, obtenir la note de A.

 Let's Encrypt

Related posts

Tuto : LibreNMS sur Debian avec nginx

Edouard Patout

Tuto : Pydio sur Debian avec nginx

Edouard Patout

Tuto : Linux, nginx, MySQL, PHP7 (LEMP)

Edouard Patout

25 comments

jey 8 novembre 2015 at 8 h 57 min

ça me marque  » nginx: [emerg] invalid number of arguments in « ssl_certificate » directive in /etc/nginx/sites-enabled/cloud.conf:32″

et du coup nginx ne démarre pas .
help

Reply
jey 8 novembre 2015 at 9 h 10 min

haaa j’ai omis les  » ;  » lol
quelle tache

Reply
Chris 14 février 2017 at 8 h 35 min

Bonjour, je n’ai encore jusqu’ici pas été capable d’installer une config https proprement. Voilà ou j’en suis. J’ai une config nginx php7 mariadb fonctionnelle grâce aux tutos de ce site. Je suis sur un pi3. Le but est l’installation de nextcloud. J’ai un nom de domaine (compagnon) fonctionnel du type domaine.x.y qui renvoie bien index.html et info.php. Je suis prudent, j’aimerai tester letsencrypt en mode staging. est-ce qu’il suffit d’ajouter staging ici ? :
/opt/letsencrypt/letsencrypt-auto certonly –staging –rsa-key-size 4096 –webroot –webroot-path /var/www -d domaine.tld
Et, si cela fonctionne installer nextcloud en décompressant le zip par la suite ?
J’ai peur qu’en me trompant nginx ne redémarre plus

Reply
Edouard Patout 14 février 2017 at 9 h 31 min

Bonjour 🙂
En toute logique oui, il suffit d’utiliser la balise « –staging » dans la commande pour utiliser cet environnement.
Si tu suis à la lettre le tutoriel tu n’auras pas besoin de ça, cette configuration est testée et éprouvée sur toutes mes machines sans jamais d’accro.

Pour Nextcloud, nous avons un tutoriel à cette adresse : https://rewopit.net/tuto-nextcloud-debian-nginx/

Reply
Chris 14 février 2017 at 18 h 46 min

Hélas non. un https://domaine.ltd/index.html me renvoie vers mon interface de box

Reply
Edouard Patout 14 février 2017 at 18 h 53 min

Si tu es auto-hébergé, il faut ouvrir le port 80 au niveau de ta box 😉

Reply
Chris 14 février 2017 at 22 h 51 min

Port 80 et 443 ouverts et redirigés vers l’IP locale + DMZ vers l’IP. ce qui est redondant. Toute demande renvoie vers https://domaine.x/login.html

Chris 15 février 2017 at 0 h 42 min

Avec une demande locale https://192.168.1.x je n’ai pas de connection sécurisée. J’ai dû raté quelque chose. Que fait-on du fichier /etc/nginx/param.conf ? A inclure dans quoi ? Désolé

Chris 15 février 2017 at 8 h 07 min

Je viens de voir une erreur. Lorsque l’on demande des détails du certificat le Common Name est : bbox et non mon nom de domaine.

Edouard Patout 15 février 2017 at 9 h 38 min

Chris, je n’ai malheureusement pas le détail de ton installation, il est donc difficile de cerner le problème.
Pour ton problème si tu fais les tests en interne (directement depuis ton LAN, vers une machine de ton LAN) il faut modifier le fichier host de ton pc pour qu’il prennent en compte le nom de domaine de ta machine. Dans le cas contraire, tu atterriras sur l’interface de ta box.

Chris 15 février 2017 at 11 h 14 min

Merci Edouard,
Malheureusement je ne suis pas informaticien et je suis perdu. J’ai bien un fichier /etc/hosts mais qu’est ce que j’écris dedans ? nslookup mondomaine (exécuté sur le PI) donne
Server: 127.0.1.1
Address: 127.0.1.1#53

Non-authoritative answer:
Name: mondomaine
Address: 176.xxx.yyy.zzz (IP fixe de ma Bbox)

Pour ma config, un raspberry pi 3 sur un « routeur » Bbox remié par ethernet avec adresse IP fixe : 192.168.x.y
Config du pi : nginx+php7+maria+nextcloud dans /usr/share/nginx/html/nextcloud (page d’accueil nginx et phpinfo s’affiche correctement sans ssl). Dans tous les fichiers j’ai fait attention de remplacer Root /var/www par root : /usr/share/nginx/html et à côté de name_server j’ai mis mon nom de domaine. La DMZ de ma bbox renvoie vers l’adresse du pi 192.168.x.y. J’ai édité la zone DNS chez mon fournisseur de domaine (Hostinger) vers l’adresse fixe de ma bbox : 176.xxx.yyy.zzz
J’ai appliqué les tutos à la lettre. La création du certificat letsencrypt n’a pas donné d’erreurs. Les fichiers sont dans /etc/letsencrypt/live/nomdomaine (mais accessibles qu’en root). Dans /etc/nginx/sites-enabled j’ai les fichiers 0-letsencrypt.conf default.conf nextcloud.conf
De quelles informations as-tu besoin ? Merci

Edouard Patout 15 février 2017 at 11 h 17 min

Il faut que tu mettes une ligne comme ça dans ton fichier host :
192.168.x.y tondomaine

Chris 15 février 2017 at 12 h 10 min

Du progrés merci Edouard. Si je prend la main sur le pi, un beau cadenas vert s’affiche pour la requête https://mondomaine/index.html
mais pour le php.info ou le https://mondomaine/nextcloud/
nginx renvoie erreur 404.
Je sens qu’on est proche

Edouard Patout 15 février 2017 at 12 h 22 min

Le tuto nextcloud présent sur le site est fait pour une installation en sous domaine, pas en sous répertoire.

Chris 15 février 2017 at 13 h 49 min

Par conséquent j’ai créé un sous domaine chez mon hébergeur (qui semble rediger tout simplement vers un sous répertoire forcément vide puisque c’est auto-hébergé).
Je modifie nextcloud.conf en conséquence : nextcloud.mondomaine
Ce qui donne :
conflicting server name « cternet.hol.es » on 0.0.0.0:80, ignored
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
L’exemple de config avec sous-répertoire : https://docs.nextcloud.com/server/9/admin_manual/installation/nginx_nextcloud_9x.html
ne fonctionne pas (en remettant le nom de domaine pour name_server et le root de base /usr/share/nginx/html;
Merci de ton aide

Chris 15 février 2017 at 14 h 13 min

Chez mon hébergeur je n’avais pas redirigé le sous domaine vers l’adresse IP de ma box type 176.xxx.yyy.zzz. Mais dois-je rediriger ver 176.xxx.yyy.zzz ou 176.xxx.yyy.zzz/nextcloud ?
Si oui il faut attendre la propagation? 48h

Chris 15 février 2017 at 12 h 21 min

Merci Edouard, j’ai un beau cadenas vert pour la requête https://mondomaine/index.html
Mais pour https://mondomaine/info.php ou https://mondomaine/nextcloud -> erreur 404
Je enregistré params.conf dans /etc/nginx/ssl, a intégrer dans un Virtualhost ? C’est quoi ? Est ce que l’erreur vient de là ?

Wilfrid 19 février 2017 at 17 h 08 min

Un grand merci, un tuto suffisamment simple à suivre, une réussite grâce à vous.

Reply
Bazh 13 avril 2017 at 16 h 30 min

Bonjour, cool les tutos, je suis en train de tester celui sur nextcloud et je me heurte a quelques petits problèmes.

En 1 : pour le certificat la commande « /opt/letsencrypt/letsencrypt-auto certonly –rsa-key-size 4096 –webroot –webroot-path /var/www -d sousdomain.mondomain.tld

me retourne

Package python-virtualenv is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package ‘python-virtualenv’ has no installation candidate

En 2: J’ai donc essayé sans certificat mais là c’est Nginx qui ne veux pas démarrer.

Failed to start A high performance web server and a reverse proxy server.

Quand je vire le owncloud.conf plus de problème.

pour info, j’ai fait le tuto LEMP, puis le certificat et nextcloud. sous Debian 8.7.1

Si tu as une petite idée ce serait sympa.

Merci

Reply
Jedediah 13 avril 2017 at 17 h 33 min

Hello 🙂
Sur quelle plateforme tu essayes d’installer tout ça ?

Dans tous les cas, si aucun certificat n’est généré, il est normal que nginx râle au lancement si tu utilises le fichier de configuration pour nextcloud que nous fournissons puisque celui-ci est fait pour fonctionner en https avec un certificat.

Reply
Bazh 14 avril 2017 at 8 h 29 min

Salut,

Je suis sur un Debian 8.7.1, Update et upgrade, les paquets

apt-get install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

sont installer pour LEMP sauf php7.0-memcached qui n’a pas envie!

Les paquets suivants contiennent des dépendances non satisfaites :
php7.0-memcached : Dépend: libmemcached11 mais il n’est pas installable
Dépend: libmemcachedutil2 mais il n’est pas installable
E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l’état ».

Pour le reste, j’ai suivi à la lettre les tutos.

Merci

Reply
Edouard Patout 14 avril 2017 at 13 h 03 min

Le LEMP n’a a priori rien à voir avec ton erreur python pour Let’s Encrypt.
Je t’avoue ne pas avoir rencontré ce genre d’erreur, sur aucune des machines où j’ai pu installer LE…

Reply
Kynel 20 septembre 2017 at 10 h 45 min

Bonjour,
J’ai suivi plusieurs de tes tutos sans aucun problème par contre la je bloque …

Quand je lance la commande /opt/letsencrypt/letsencrypt-auto certonly –rsa-key-size 4096 –webroot –webroot-path /var/www -d domaine.tld

J’obtiens pas un message de félicitation comme tu le dis… c’est ce message qui apparaît :

Failed authorization procedure. mondomaine.com (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://mondomaine.com/.well-know/acme-challenge/mj0nW9……………… : Timeout.

Aurais-tu une idée ?

Merci pour tout les tutos présent sur ton site 😉

Reply
Edouard Patout 20 septembre 2017 at 12 h 52 min

Tu as bien ajouté les lignes de configuration à ton vhost nginx ?

Reply
Kynel 20 septembre 2017 at 15 h 17 min

Je te répond dans un nouveau commentaire (impossible d’utiliser le bouton répondre), le problème venais juste de mon NAT la redirection de port n’étais pas bonne.

Merci du coup de main quand même !
Cordialement.

Reply

Leave a Comment

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More