Changer le thème

Configuration Nginx SSL/TLS en pratique : du certificat HTTPS au durcissement A+

Easton editorial illustration: container packing dock

L’alerte de monitoring a retenti soudainement. En ouvrant le téléphone : certificat expiré — un certificat gratuit de 90 jours, complètement oublié. L’avertissement rouge « Non sécurisé » du navigateur flottait comme un drapeau moqueur sur la page d’accueil du blog.

Après cet incident, j’ai passé une semaine à maîtriser la configuration Nginx SSL/TLS de bout en bout. De F à A+ sur SSL Labs, du renouvellement manuel à l’automatisation complète, des performances qui traînent à un handshake sous 100 ms.

HTTPS, ce n’est pas seulement un cadenas dans la barre d’adresse. Google a clairement indiqué que HTTPS est un facteur de classement. Bien configuré, le trafic organique peut progresser de 15 à 20 %. Surtout, cela bloque l’écoute en man-in-the-middle. Sans HTTPS, c’est comme crier son code bancaire en public.

Cet article vous guide pour configurer Nginx HTTPS de zéro : demande de certificat Let’s Encrypt, durcissement TLS 1.3, modèle SSL Labs A+, et renouvellement automatique pour la production. Toutes les configurations sont prêtes à copier-coller.


Chapitre 1 : bases HTTPS et choix du type de certificat

1.1 Pourquoi chaque site a besoin de HTTPS

HTTP transmet en clair : chaque page visitée, chaque formulaire soumis circule nu sur le réseau. Le WiFi public du café, la sortie réseau de l’entreprise, l’équipement de l’opérateur — n’importe quel nœud intermédiaire peut voir ce que vous envoyez.

HTTPS ajoute une couche TLS entre HTTP et TCP. Les données sont chiffrées avant l’envoi et déchiffrées à l’arrivée ; l’espion ne voit qu’un flot illisible.

TLS ne se limite pas au chiffrement. Il fournit aussi l’authentification — garantir que vous accédez au vrai example.com, pas à un site de phishing après hijack DNS. D’où l’avertissement rouge du navigateur sur certificat expiré ou domaine non concordant : « ce site n’est peut-être pas celui qu’il prétend être ».

1.2 Les trois types de certificats SSL : DV, OV, EV

Les certificats se classent selon le niveau de vérification :

TypeVérificationPrixCas d’usage
DV (Domain Validation)Propriété du domaineGratuit - faibleBlog perso, environnement de test, petit projet
OV (Organization Validation)Domaine + identité organisationMoyenSite corporate, produit SaaS
EV (Extended Validation)Vérification d’identité stricteÉlevéFinance, paiement, administration

Pour la plupart des projets personnels et petites équipes, un certificat DV suffit largement. Le DV gratuit Let’s Encrypt, valable 90 jours, est aussi fiable dans les navigateurs qu’un DV payant. Le seul « inconvénient » : renouveler tous les 90 jours — mais avec l’automatisation, ce n’est plus un problème.

OV et EV se distinguent surtout par l’affichage dans la barre d’adresse. EV affichait le nom de l’entreprise (ex. « Banque industrielle et commerciale de Chine »), mais les navigateurs réduisent de plus en plus cette emphase ; Chrome n’affiche plus par défaut le nom EV. Avec des prix OV/EV souvent élevés, le rapport qualité-prix est faible.

1.3 Let’s Encrypt : le meilleur choix gratuit

Let’s Encrypt est une autorité de certification à but non lucratif opérée par l’ISRG (Internet Security Research Group). Avantages principaux :

  • Entièrement gratuit : certificats DV gratuits à vie
  • Automatisation : émission et renouvellement via le protocole ACME
  • Confiance large : tous les navigateurs et OS majeurs
  • Validité 90 jours : certificats courts plus sûrs, incitent à l’automatisation

Inconvénients : uniquement DV, pas d’OV/EV ; certificat wildcard nécessite une validation DNS (un peu plus lourd). Pour 99 % des projets personnels et sites de taille moyenne, ces limites ne comptent pas.

Nous utiliserons Certbot — client officiel Let’s Encrypt — pour demander le certificat.


Chapitre 2 : demande de certificat Let’s Encrypt en pratique

2.1 Installer Certbot

L’installation varie selon l’OS. Sous Ubuntu, c’est le plus simple :

# Ubuntu 20.04+ / Debian 10+
sudo apt update
sudo apt install certbot python3-certbot-nginx

Sous CentOS/RHEL, activer d’abord le dépôt EPEL :

# CentOS 8 / RHEL 8
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx

Après installation, certbot --version vérifie la version. Ensuite, demander le certificat.

2.2 Demander un certificat

Certbot propose plusieurs modes de validation ; les plus courants sont standalone et webroot. Si Nginx tourne déjà, privilégiez webroot :

# Mode webroot : site déjà en ligne
sudo certbot certonly --webroot -w /var/www/example.com -d example.com -d www.example.com

-w indique la racine web, -d le domaine. Une seule commande peut couvrir plusieurs domaines.

Si Nginx n’est pas démarré ou pour un serveur de test temporaire, mode standalone :

# Mode standalone : occupe temporairement le port 80
sudo certbot certonly --standalone -d example.com -d www.example.com

Certbot lance un serveur HTTP temporaire, puis le ferme après validation. Le port 80 doit être libre ; si Nginx tourne, arrêtez-le d’abord.

Une option plus simple : le plugin Nginx de Certbot modifie la config automatiquement :

# Mode auto : Certbot modifie la config Nginx
sudo certbot --nginx -d example.com -d www.example.com

Cette commande demande le certificat, modifie Nginx et configure la redirection HTTPS. Pratique pour débuter ; en production, configurez manuellement pour un contrôle fin des paramètres SSL.

2.3 Structure des fichiers certificat

Après succès, les fichiers sont dans /etc/letsencrypt/live/example.com/ :

/etc/letsencrypt/live/example.com/
├── cert.pem        # Certificat du domaine
├── chain.pem       # Chaîne intermédiaire
├── fullchain.pem   # Chaîne complète (cert + chain)
└── privkey.pem     # Clé privée

Nginx utilise deux fichiers : fullchain.pem (ssl_certificate) et privkey.pem (ssl_certificate_key). privkey.pem est sensible, permissions 600 — ne jamais le divulguer.


Chapitre 3 : configuration SSL de base Nginx

3.1 Configuration HTTPS minimale

Avec le certificat en place, configurez HTTPS dans Nginx. Version la plus simple :

server {
    listen 443 ssl;
    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;

    # Autres réglages...
    root /var/www/example.com;
    index index.html;
}

HTTPS fonctionne, mais le score reste autour de D. Problème : pas de version TLS explicite ; par défaut TLS 1.0 et 1.1 — obsolètes et dangereux.

3.2 Redirection HTTP vers HTTPS

Configurer HTTPS ne suffit pas : les utilisateurs peuvent arriver en HTTP. Redirigez tout le trafic HTTP vers HTTPS :

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

    # Redirection permanente vers HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    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;

    # Autres réglages...
}

return 301 est une redirection permanente, mise en cache par le navigateur. La prochaine fois qu’un utilisateur tape http://, le navigateur ira directement en https://, sans requête supplémentaire.

3.3 Erreur de configuration fréquente

Beaucoup ajoutent http2 dans listen 443 ssl http2;. Depuis Nginx 1.25.1, HTTP/2 passe par la directive http2 :

# Nouvelle syntaxe Nginx 1.25.1+
server {
    listen 443 ssl;
    http2 on;  # Directive http2 séparée
    server_name example.com;

    # ...
}

Sur une version récente, préférez cette syntaxe pour éviter les avertissements. nginx -v vérifie la version.


Chapitre 4 : durcissement sécurité TLS 1.3

4.1 Choix de la version TLS

Quatre versions TLS : 1.0, 1.1, 1.2, 1.3. Les versions 1.0 et 1.1 sont obsolètes ; tous les navigateurs majeurs les ont abandonnées en 2020.

VersionSécuritéPerformanceCompatibilitéRecommandation
TLS 1.0Non sécuriséLentLargeDésactiver
TLS 1.1Non sécuriséLentLargeDésactiver
TLS 1.2SécuriséMoyenQuasi universelConserver
TLS 1.3Le plus sûrLe plus rapideNavigateurs modernesActiver

L’avantage clé de TLS 1.3 : handshake de 2-RTT (aller-retour) à 1-RTT, latence théoriquement divisée par deux. En pratique, le handshake TLS 1.3 peut rester sous 100 ms.

Dans Nginx, ssl_protocols fixe les versions :

ssl_protocols TLSv1.2 TLSv1.3;

Ne pas n’activer que TLS 1.3. En 2026, presque tous les navigateurs le supportent, mais certains clients HTTP anciens (outils API, appareils embarqués) peuvent ne pas le faire. Garder TLS 1.2 comme repli est plus prudent.

4.2 Configuration Cipher Suite

La Cipher Suite (suite de chiffrement) définit algorithme, échange de clés et MAC. Un mauvais choix rend HTTPS inefficace.

Liste recommandée TLS 1.3 en 2026 :

ssl_protocols TLSv1.2 TLSv1.3;

# Cipher TLS 1.3 (Nginx utilise la liste OpenSSL par défaut)
# Cette ligne peut être omise
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;

# Cipher TLS 1.2 (rétrocompatibilité)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;

# Priorité aux cipher du serveur
ssl_prefer_server_ciphers on;

Points clés :

  • ECDHE : échange de clés courbe elliptique, plus sûr et rapide que RSA
  • AES-GCM : chiffrement authentifié, plus sûr que CBC
  • CHACHA20-POLY1305 : meilleures perfs mobile sans accélération AES matérielle

En cas de doute, Mozilla SSL Configuration Generator : https://ssl-config.mozilla.org/

4.3 HSTS : forcer l’accès HTTPS

HSTS (HTTP Strict Transport Security) indique au navigateur : « ce site n’accepte que HTTPS ». Même si l’utilisateur tape http://, le navigateur redirige localement vers https://, sans requête réseau supplémentaire.

# En-tête HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Paramètres :

  • max-age=31536000 : validité 1 an (en secondes)
  • includeSubDomains : inclut tous les sous-domaines
  • preload : inscription à la HSTS Preload List (soumission sur hstspreload.org)

Attention : une fois HSTS activé, le navigateur met en cache longtemps. Si vous devez encore tester en HTTP, n’ajoutez pas preload ou réduisez max-age.


Chapitre 5 : optimisation des performances SSL

5.1 SSL Session Cache

Chaque handshake TLS implique échange de clés et vérification de certificat. Session Cache permet au client de réutiliser une session pendant un certain temps, sans handshake complet.

# Configuration Session Cache
ssl_session_cache shared:SSL:10m;  # Cache 10 Mo, ~40 000 sessions
ssl_session_timeout 1d;            # Validité session 1 jour
ssl_session_tickets off;           # Désactiver Session Ticket (plus sûr)

shared:SSL:10m : cache 10 Mo partagé entre workers. ~4 000 sessions par Mo, 10 Mo suffisent pour un site moyen.

ssl_session_tickets off pour la sécurité : Session Ticket nécessite une clé serveur ; si elle fuit, un attaquant peut déchiffrer l’historique. Désactivé = plus sûr, mais charge serveur accrue — adapté aux exigences élevées.

5.2 OCSP Stapling

Pour vérifier un certificat, le navigateur interroge l’OCSP de l’AC. Cela ajoute une requête réseau et expose les sites visités.

OCSP Stapling : le serveur interroge l’OCSP à la place du navigateur, met en cache le résultat et l’envoie avec la réponse. Confidentialité et latence réduites.

# Configuration OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

resolver définit le serveur DNS pour résoudre le domaine du serveur OCSP. 8.8.8.8 et 8.8.4.4 de Google sont courants.

Test avec OpenSSL :

openssl s_client -connect example.com:443 -status < /dev/null 2>&1 | grep -A 17 "OCSP response"

Si vous voyez « OCSP Response Status: successful », OCSP Stapling fonctionne.

5.3 Réglage ssl_buffer_size

ssl_buffer_size contrôle la taille des enregistrements TLS. Par défaut 16 Ko — trop pour les petites réponses (API), augmente le TTFB (time to first byte).

Pour API ou blog à petites réponses :

ssl_buffer_size 4k;  # Adapté aux petites réponses

Pour serveur de gros fichiers, gardez 16 Ko par défaut ou montez à 32 Ko.


Chapitre 6 : renouvellement automatique des certificats

6.1 Commande de renouvellement Certbot

Les certificats Let’s Encrypt durent 90 jours ; renouvellement obligatoire. Certbot fournit renew :

# Test de renouvellement (sans renouveler réellement)
sudo certbot renew --dry-run

# Renouvellement effectif
sudo certbot renew

renew vérifie toutes les dates d’expiration ; seuls les certificats avec moins de 30 jours restants sont renouvelés. Vous pouvez lancer la commande quotidiennement sans gaspiller le quota de débit Let’s Encrypt.

6.2 Tâche planifiée crontab

La méthode la plus fiable : crontab pour le renouvellement automatique :

# Éditer le crontab root
sudo crontab -e

Ajoutez ces deux lignes :

# Vérification à 3h00 et 15h00 chaque jour
0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
0 15 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

--quiet mode silencieux. --post-hook "systemctl reload nginx" recharge Nginx après renouvellement réussi.

Pourquoi deux fois par jour ? Les échecs occasionnels (DNS temporaire) arrivent ; plus de vérifications améliorent le taux de succès.

6.3 Test de renouvellement et dépannage

En cas d’échec, Certbot journalise dans /var/log/letsencrypt/letsencrypt.log. Problèmes fréquents :

  1. Port occupé : standalone exige le port 80 libre
  2. Échec DNS : vérifier que le domaine pointe vers le serveur
  3. Limite de débit : Let’s Encrypt autorise 5 demandes identiques par semaine ; utilisez --dry-run pour les tests
  4. Permissions : Certbot doit lire/écrire /etc/letsencrypt/

Flux de test complet :

# 1. dry-run d'abord
sudo certbot renew --dry-run

# 2. Si dry-run OK, renouvellement réel
sudo certbot renew

# 3. Vérifier la validité
sudo certbot certificates

# 4. Recharger Nginx
sudo systemctl reload nginx

Modèle de configuration complet

Modèle Nginx SSL prêt pour la production, score SSL Labs A+ :

# Redirection HTTP
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# Service HTTPS
server {
    listen 443 ssl;
    http2 on;
    server_name example.com www.example.com;

    # Certificats
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Versions TLS
    ssl_protocols TLSv1.2 TLSv1.3;

    # Cipher Suite
    ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;

    # En-têtes de sécurité
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Session Cache
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # Optimisation performance
    ssl_buffer_size 4k;

    # Site
    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

Après configuration, testez sur SSL Labs : https://www.ssllabs.com/ssltest/


Conclusion

Configurer HTTPS est accessible — quelques lignes suffisent pour démarrer. Atteindre A+ sur SSL Labs tout en équilibrant performance et compatibilité exige de comprendre versions TLS, Cipher Suite, Session Cache et OCSP Stapling.

Points clés :

  1. Certificat : Let’s Encrypt gratuit, Certbot pour l’automatisation
  2. Versions TLS : TLS 1.2 + 1.3, désactiver 1.0 et 1.1
  3. Cipher Suite : priorité ECDHE et AES-GCM, CHACHA20 en complément
  4. HSTS : forcer HTTPS, réduire les redirections
  5. Performance : Session Cache et OCSP Stapling indispensables
  6. Renouvellement auto : crontab en double, rechargement Nginx après renouvellement

Copiez le modèle ci-dessus dans votre config Nginx, adaptez domaine et chemins de certificats, et c’est prêt. Testez ensuite sur SSL Labs — dites-moi en commentaire votre score, je parie sur A+.

Configurer Nginx SSL/TLS pour obtenir un score de sécurité A+

Processus complet de la demande de certificat au durcissement sécurité

⏱️ Estimated time: 30 min

  1. 1

    Step 1: Installer Certbot et demander un certificat

    Demander un certificat SSL Let's Encrypt gratuit avec Certbot :

    • Ubuntu/Debian : sudo apt install certbot python3-certbot-nginx
    • CentOS/RHEL : sudo dnf install certbot python3-certbot-nginx
    • Demande : sudo certbot certonly --webroot -w /var/www/example.com -d example.com
    • Répertoire certificats : /etc/letsencrypt/live/example.com/
    • Deux fichiers requis : fullchain.pem et privkey.pem
  2. 2

    Step 2: Configurer les bases HTTPS Nginx

    Ajouter le certificat SSL et la redirection HTTP dans la config Nginx :

    • listen 443 ssl ; écoute HTTPS
    • http2 on ; activer HTTP/2 (Nginx 1.25.1+)
    • ssl_certificate pointe vers fullchain.pem
    • ssl_certificate_key pointe vers privkey.pem
    • return 301 https://$server_name$request_uri ; redirection HTTP vers HTTPS
  3. 3

    Step 3: Configurer TLS 1.3 et Cipher Suite

    Activer des versions TLS et suites de chiffrement sécurisées :

    • ssl_protocols TLSv1.2 TLSv1.3 ; désactiver les anciennes versions
    • ssl_ciphers avec ECDHE + AES-GCM + CHACHA20
    • ssl_prefer_server_ciphers on ; priorité au serveur
    • add_header Strict-Transport-Security pour activer HSTS
  4. 4

    Step 4: Optimiser les performances SSL

    Configurer Session Cache et OCSP Stapling pour améliorer les performances :

    • ssl_session_cache shared:SSL:10m ; cache de session partagé
    • ssl_session_timeout 1d ; validité de session 1 jour
    • ssl_stapling on ; activer OCSP Stapling
    • ssl_buffer_size 4k ; optimiser les petites réponses
  5. 5

    Step 5: Configurer le renouvellement automatique

    Configurer le renouvellement automatique Certbot via crontab :

    • sudo crontab -e pour éditer la tâche planifiée
    • 0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
    • Deux vérifications par jour (matin et après-midi)
    • --post-hook recharge Nginx après renouvellement
  6. 6

    Step 6: Tester la sécurité de la configuration SSL

    Vérifier que la configuration atteint le score A+ :

    • Visiter https://www.ssllabs.com/ssltest/ pour tester la config SSL
    • Utiliser openssl s_client -connect example.com:443 -status pour tester OCSP
    • Vérifier certbot certificates pour la validité
    • S'assurer que HSTS, OCSP Stapling et Session Cache sont actifs

FAQ

Quelle est la durée de validité d'un certificat Let's Encrypt ? Faut-il renouveler manuellement ?
Les certificats Let's Encrypt sont valides 90 jours. Il est recommandé de configurer le renouvellement automatique via crontab, avec deux vérifications par jour et rechargement Nginx après renouvellement. Une fois l'automatisation en place, plus besoin d'intervention manuelle.
Comment tester la sécurité de la configuration SSL Nginx ?
Test en ligne recommandé avec SSL Labs : https://www.ssllabs.com/ssltest/

• A+ est le score maximal, indiquant une config sécurisée et performante
• Vous pouvez aussi tester OCSP Stapling en local avec openssl s_client
• Commande : openssl s_client -connect example.com:443 -status
HTTPS dégrade-t-il les performances du site ? Comment optimiser ?
HTTPS ajoute un coût au handshake TLS, mais bien optimisé l'impact reste faible :

• TLS 1.3 passe de 2-RTT à 1-RTT, latence divisée par deux
• Session Cache permet au client de réutiliser une session, sans handshake complet
• OCSP Stapling réduit les requêtes réseau de vérification de certificat
• Après optimisation, le handshake peut rester sous 100 ms
Que faire en cas d'échec de renouvellement ? Comment diagnostiquer ?
Causes fréquentes et solutions :

• Port occupé : le mode standalone exige le port 80 libre
• Échec DNS : vérifier que le domaine pointe vers l'IP du serveur
• Limite de débit : Let's Encrypt autorise au plus 5 demandes identiques par semaine
• Consulter les logs : /var/log/letsencrypt/letsencrypt.log
Quelle différence entre TLS 1.2 et TLS 1.3 ? Pourquoi activer les deux ?
TLS 1.3 apporte des avantages significatifs par rapport à TLS 1.2 :

• Performance : handshake de 2-RTT à 1-RTT, latence divisée par deux
• Sécurité : suppression des algorithmes de chiffrement obsolètes
• Compatibilité : activer les deux permet de supporter les anciens clients, TLS 1.2 comme option de repli
Quelles précautions pour la configuration HSTS ?
Points d'attention pour HSTS :

• max-age recommandé à 31536000 (1 an)
• includeSubDomains affecte tous les sous-domaines
• preload nécessite une soumission sur hstspreload.org
• Au premier déploiement, tester avec un max-age court avant de l'allonger
Comment choisir le type de certificat SSL ? Différences DV, OV, EV ?
Recommandations par type de certificat :

• DV : gratuit, vérifie la propriété du domaine, adapté aux blogs personnels et petits projets
• OV : vérifie l'identité de l'organisation, affiche les infos entreprise, adapté aux sites corporate
• EV : vérification stricte, Chrome n'affiche plus le nom de l'entreprise, faible rapport qualité-prix
• Dans 99 % des cas, le certificat DV gratuit Let's Encrypt suffit

11 min de lecture · Publié le: 20 avr. 2026 · Mis à jour le: 27 juil. 2026

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog