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
- Dans lightsail, sous
Networking
, sous la sectionIPv4 Firewall
, cliquez surAdd Rule
. - Sélectionnez
HTTPS
sousApplication
- 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
- Commitez et poussez vos changements
- Récupérez les changements sur le serveur (git pull)
- Fermez et repartez le serveur
docker compose stop
docker compose up -d
- 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
- 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;
}
}
}
- Poussez les changements sur git
- Récupérez les changements sur le serveur
- Fermez et repartez le serveur
docker compose stop
docker compose up -d
La connexion devrait maintenant être sécurisée! 🎉