Aller au contenu principal

HTTPS et certificat SSL

Nous avons quelque peu simplifié les choses jusqu'à maintenant en évitant de gérer la connexion sécurisée HTTPS.

Pour gérer cet aspect, nous utiliserons Let's Encrypt qui permet de générer facilement, et surtout gratuitement, des certificats SSL.

Plus spécifiquement Certbot cela permet de faciliter la gestion et le renouvellement automatique des certificats via Let's Encrypt.

Activer le port 443

  1. Dans lightsail, sous Networking, sous la section IPv4 Firewall, cliquez sur Add Rule.
  2. Sélectionnez HTTPS sous Application img
  3. Appuyez sur Create

Ajouter Certbot à docker-compose

services:
postgres:
image: postgres:17-alpine
container_name: snowfall_postgres
environment:
- POSTGRES_DB=snowfall_db
- POSTGRES_USER=snowfall_user
- POSTGRES_PASSWORD=motdepasse
volumes:
- pgdata:/var/lib/postgresql/data

client:
build:
context: .
dockerfile: Snowfall.Web.Mvc/Dockerfile
container_name: snowfall_client
environment:
- ASPNETCORE_URLS=http://+:80
- DossierStorage=storage-images
expose:
- "80"
volumes:
- shared-images:/storage-images
depends_on:
- postgres

reverse-proxy:
image: nginx:alpine
container_name: reverse_proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- certs:/etc/letsencrypt
- certs-data:/data/letsencrypt
depends_on:
- client

certbot:
image: certbot/certbot
container_name: certbot
volumes:
- certs:/etc/letsencrypt
- certs-data:/data/letsencrypt

volumes:
pgdata:
shared-images:
certs:
certs-data:

Configurer nginx

Pour que des certificats puissent être générés par Let's Encrypt, l'URL /.well-known/acme-challenge/ doit être accessible puisqu'elle est contactée lors de la vérification du domaine.

events { }

http {
upstream client_app {
server client:80;
}

server {
listen 80;
server_name snowfallweb.com www.snowfallweb.com;

# Permet à Certbot de valider le domaine via HTTP
location /.well-known/acme-challenge/ {
root /data/letsencrypt;
}

# Proxy pour votre application
location / {
proxy_pass http://client_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}

Repartir le serveur et demander un certificat

  1. Commitez et poussez vos changements
  2. Récupérez les changements sur le serveur (git pull)
  3. Fermez et repartez le serveur
    1. docker compose stop
    2. docker compose up -d
  4. Demandez un certificat à l'aide de certbot (changez pour votre nom de domaine)
    docker compose run certbot certonly --webroot --webroot-path=/data/letsencrypt -d snowfallweb.com -d www.snowfallweb.com
  5. Complétez les questions qui vous seront posées et vous devriez avoir un message du genre
    Account registered.
    Requesting a certificate for snowfallweb.com and www.snowfallweb.com

    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/snowfallweb.com/fullchain.pem
    Key is saved at: /etc/letsencrypt/live/snowfallweb.com/privkey.pem
    This certificate expires on 2025-04-20.
    These files will be updated when the certificate renews.

Configurer nginx pour les requêtes HTTPS

Finalement, il nous reste à configurer nginx pour servir les requêtes HTTPS pour le domaine.

events { }

http {
upstream client_app {
server client:80;
}

# Bloc pour les requêtes HTTP
server {
listen 80;
server_name snowfallweb.com www.snowfallweb.com;

# Pour Certbot
location /.well-known/acme-challenge/ {
root /data/letsencrypt;
}

# Redirige le reste des requêtes vers HTTPS
location / {
return 301 https://$host$request_uri;
}
}

# Bloc pour les requêtes HTTPS
server {
listen 443 ssl;
server_name snowfallweb.com www.snowfallweb.com;

ssl_certificate /etc/letsencrypt/live/snowfallweb.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/snowfallweb.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# Permet également le challenge pour HTTPS
location /.well-known/acme-challenge/ {
root /data/letsencrypt;
}

location / {
proxy_pass http://client_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
  1. Poussez les changements sur git
  2. Récupérez les changements sur le serveur
  3. Fermez et repartez le serveur
    1. docker compose stop
    2. docker compose up -d

La connexion devrait maintenant être sécurisée! 🎉