Générer des certificats SSL pour vos développements en local

Vous avez sans doute déjà été confronté à devoir mettre en place du HTTPS en local mais vous avez baissé les bras face à la tâche que cela représente ?

Jérémy 🤘
Jérémy 🤘

Vous avez sans doute déjà été confronté à devoir mettre en place du HTTPS en local mais vous avez baissé les bras face à la tâche que cela représente ? Et bien maintenant avec mkcert vous allez pouvoir faire ça en littérallement 2 lignes de script.

Une fois que vous avez installé mkcert (que ce soit via le binaire ou via brew), vous pouvez lancer la commande :

Copier
mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com
mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com

Une fois ces fichiers générés, vous allez devoir lancer la commande suivante pour installer les certificats sur votre machine afin que votre navigateur puisse les reconnaître et surtout les considérer comme valides :

Copier
mkcert -install
mkcert -install

Et voilà, vous avez vos certificats SSL. Vous pouvez maintenant les utiliser dans votre configuration locale avec apache ou nginx. Les certificats sont valables 10 ans, donc cela laisse largement le temps de terminer votre projet.

Pour ma part j'utilise un reverse proxy nginx qui me permet d'avoir sur un environnement local plusieurs conteneurs docker qui tournent sur les mêmes ports 80 et 443 sans qu'il n'y ait de conflits. Très simple à mettre en place et en plus il gère nativement le HTTP2.

Demo

docker-compose.yml

Copier
version: '3.5'

services:
    nginx_proxy:
        image: jwilder/nginx-proxy
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./certificates/site.loc.pem:/etc/nginx/certs/site.loc.crt:ro
            - ./certificates/site.loc.key:/etc/nginx/certs/site.loc.key:ro
            - /var/run/docker.sock:/tmp/docker.sock:ro
        restart: unless-stopped

    nginx_site:
        build:
            context: .
            dockerfile: nginx/Dockerfile
        environment:
            - VIRTUAL_HOST=${HTTP_HOST}
            - CERT_NAME=site.loc
        volumes:
            - ..:/var/www/html
            - ./nginx/config/vhost.nginx:/etc/nginx/conf.d/default.conf:ro
        restart: unless-stopped
version: '3.5'

services:
    nginx_proxy:
        image: jwilder/nginx-proxy
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./certificates/site.loc.pem:/etc/nginx/certs/site.loc.crt:ro
            - ./certificates/site.loc.key:/etc/nginx/certs/site.loc.key:ro
            - /var/run/docker.sock:/tmp/docker.sock:ro
        restart: unless-stopped

    nginx_site:
        build:
            context: .
            dockerfile: nginx/Dockerfile
        environment:
            - VIRTUAL_HOST=${HTTP_HOST}
            - CERT_NAME=site.loc
        volumes:
            - ..:/var/www/html
            - ./nginx/config/vhost.nginx:/etc/nginx/conf.d/default.conf:ro
        restart: unless-stopped

Dockerfile (nginx)

Je suis obligé de faire un Dockerfile car par défaut, le port 443 n'est pas exposé.

Copier
FROM nginx:1.17-alpine

EXPOSE 80
EXPOSE 443
FROM nginx:1.17-alpine

EXPOSE 80
EXPOSE 443