SSL/TLS : Certification, HTTPS et hardening
Procédures et exemples pour obtenir et déployer des certificats TLS, configurer Nginx pour HTTPS et appliquer des mesures de durcissement (niveau intermédiaire). Le périmètre exclut les solutions cloud managées. Mention : Tailscale pour usages privés.
Concepts rapides
- Clé privée : conservée sur le serveur, ne doit jamais être exposée.
- CSR (Certificate Signing Request) : contient la clé publique et les informations du sujet pour demander un certificat.
- Certificat (CRT) : délivré par une CA et présenté au client lors de la négociation TLS.
Types de certificats courants : self-signed (développement/interne), CA publique (Let's Encrypt, payant), CA interne (PKI d'entreprise).
Obtenir un certificat — Let's Encrypt (Certbot)
Utiliser Certbot est la méthode la plus simple pour obtenir et renouveler des certificats gratuits Let's Encrypt. Exemples d'installation et commande d'obtention :
=== "Linux (Debian/Ubuntu)"
```bash
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
# Obtenir et configurer automatiquement pour Nginx
sudo certbot --nginx -d example.com -d www.example.com
=== "macOS (Homebrew)"
brew install certbot
# Utiliser --nginx si Nginx est installé via brew
sudo certbot --nginx -d example.com
=== "Windows / WSL"
# Sur Windows, préférez WSL ou Docker pour Certbot
# Exemple (WSL Ubuntu): répéter la commande Linux ci‑dessus
sudo certbot --nginx -d example.com
Si l'hôte n'est pas encore servi par Nginx (ou port 80 est bloqué), on peut utiliser le mode standalone :
sudo certbot certonly --standalone -d example.com
Certbot installe les certificats dans /etc/letsencrypt/live/<domain>/ et configure le renouvellement automatique (certbot renew).
Exemple de configuration Nginx (HTTP -> HTTPS)
Voici un exemple minimal pour rediriger tout le trafic HTTP vers HTTPS, puis la configuration HTTPS qui utilise les certificats Let's Encrypt.
Fichier de redirection (port 80) :
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Bloc HTTPS :
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!3DES';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
location / {
root /var/www/html;
index index.html index.htm;
}
}
Remarques :
- Testez HSTS avec prudence : activez
includeSubDomainsetpreloadseulement après avoir validé la configuration pour tous les sous-domaines. - Les directives ci‑dessus offrent un bon compromis pratique ; elles ne remplacent pas une politique de sécurité adaptée à des contraintes particulières.
Certificats autosignés (usage local / VPN)
Pour des services internes inatteignables publiquement (ex. accessibles via un VPN, par exemple Tailscale), un certificat autosigné est souvent suffisant si le CA racine est distribué aux clients.
Générer une paire clé+certificat autosigné :
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/example.key \
-out /etc/ssl/certs/example.crt \
-subj "/CN=example.internal"
Configurer Nginx pour utiliser ces fichiers :
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
VPN (par exemple Tailscale) :
- Service uniquement accessible via un VPN : distribuer le certificat CA aux machines clientes ou utiliser ACME DNS-01 si un enregistrement DNS public est disponible.
- Des fonctionnalités comme MagicDNS (Tailscale) facilitent la résolution de noms privés et l'utilisation de certificats autosignés en environnement contrôlé.
Renouvellement et automatisation
- Let's Encrypt : Certbot installe normalement un timer systemd/cron job ; vérifier avec
sudo systemctl list-timers | grep certbotou exécuter manuellementsudo certbot renew --dry-run. - Après renouvellement, reload Nginx :
sudo systemctl reload nginx.
Tests et vérifications
- Vérifier en local :
curl -I https://example.com
openssl s_client -connect example.com:443 -servername example.com
- Tester publiquement : utiliser SSL Labs (https://www.ssllabs.com/ssltest/) pour un rapport complet.
Checklist de durcissement (niveau intermédiaire)
- Forcer TLSv1.2+ (désactiver TLS1.0/1.1).
- Activer TLS1.3 si disponible.
- Configurer HSTS avec prudence.
- Activer OCSP stapling (
ssl_stapling on;). - Rediriger tout le trafic HTTP vers HTTPS.
- Vérifier les en-têtes de sécurité (HSTS, X-Content-Type-Options, Referrer-Policy selon le besoin).
- Automatiser le renouvellement et tester le process (
certbot renew --dry-run).
Références et lecture recommandée
- Certbot documentation — https://certbot.eff.org/
- OpenSSL manpages
- Qualys SSL Labs — https://www.ssllabs.com/ssltest/