Ajouter du SSL dans docker avec nginx et certbot

Certbot Docker Docker Compose Let's encrypt Nginx

Franck

Date publication: Oct. 31, 2019, 12:16 p.m.
Dernière mise à jour: Oct. 31, 2019, 12:16 p.m.


Photo by Ankit Manoharan on Unsplash

Voici une manière simple d'ajouter un certificat SSL dans Docker


Aujourd'hui je devais renouveler mon certificat SSL pour mon site internet, mais je venais de refaire mon site sous Docker et je n'avais pas d'expérience dessus.

Alors je me suis mis à rechercher sur internet comment faire et après plusieurs essais et surtout beaucoups d'erreurs je suis arrivé sur un article sur medium  très intéressant et facile, je me suis dis qu'il serait intéressant d'écrire un petit résumé  sur la mise en place des certificats SSL en français.

Alors c'est parti.

Premièrement, nous allons faire la configuration du fichier docker-compose.html

version: '3'
services:
  nginx:
    image: nginx:1.15-alpine
    ports:
      - "80:80"
      - "443:443" 
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
  certbot:
    image: certbot/certbot

Ici nous avons quelques points à expliquer. Tout d'abord dans le service Nginx, nous ouvrons le ports 443 normale vu que nous voulons faire des requêtes https. Nous avons aussi le volume contenant la configuration Nginx pour pouvoir facilement modifier cette dernière. Pour finir nous avons l'image de certbot. C'est elle qui va nous permettre de gérer le certifcat SSL.

Deuxième étapes la configuration Nginx.

Ici, nous allons transférer toutes les requêtes http en https.

server {
    listen 80;
    server_name example.org;
    location / {
        return 301 https://$host$request_uri;
    }    
}
server {
    listen 443 ssl;
    server_name example.org;
    
    location / {
        proxy_pass http://example.org; #for demo purposes
    }
}

ce n'est pas encore fini alors ne tentez pas de démarrer vos conteneurs parce que ça échouera.

Maintenant lions ensemble Nginx et Certbot grâce aux volumes. Toujours dand le fichier docker-compose.yml ajouter ceci dans le service nginx :

- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot

et ceci dans le service certbot:

volumes:
  - ./data/certbot/conf:/etc/letsencrypt
  - ./data/certbot/www:/var/www/certbot

À partir de maintenant, nous allons être capable de faire le challenge de Let's encrypt. Mais pour cela nous allons devoir accepter une requêtes http dans nginx donc, dans le fichier de conf de Nginx ajouter ceci :

location /.well-known/acme-challenge/ {
    root /var/www/certbot;
}

Après cela nous devons faire une référence avec le certificat SSL de certbot, donc toujours dans le fichier de configuration Nginx ajouter ceci:

ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

Maintenant, nous allons pouvoir installer le certificat.

Heureusement l'Auteur de l'article a fait un script qui permet de faire tout cela pour nous (son github).

Donc lancer cette commande dans le dossier de votre application :

curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh

Éditer le script pour changer le courriel, le domaine de votre site ainsi que les chemins si nécessaire.

puis rouler les commandes :

chmod +x init-letsencrypt.sh
sudo ./init-letsencrypt.sh

Le renouvellement automatique du certificat.

Dans docker-compose.yml ajouter ceci dans le service certbot.

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

Cela renouvellera votre certificat toutes les 12 heures et pour finir il faut que Nginx redémarre suite à la mise à jour du certificat, et pour cela nous allons ajouter ceci dans le service Nginx:

command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

Il ne vous reste plus qu'a démarrer le tout grâce à la commande suivante:

docker-compose up -d

et voila.