L’authentification mutuelle TLS (mTLS) renforce HTTPS en exigeant un certificat côté client en plus du certificat serveur.
Objectif : authentifier les clients (humains ou services) sans mot de passe, avec une autorité de certification (CA) de confiance.
Plan de l’article
- Pré-requis et concepts (CA, CRL/OCSP, chaînage)
- Générer une CA et des certificats client
- Activer mTLS avec Nginx
- Activer mTLS avec Apache
- Gérer la révocation (CRL/OCSP stapling)
- Bonnes pratiques et dépannage
Pré-requis et concepts
- CA (autorité de certification) qui signe les certificats client.
- Chaîne de confiance : serveur présente sa chaîne, le client présente son cert signé par la CA de confiance du serveur.
- Revocation : CRL (listes de révocation) et/ou OCSP (vérification en ligne).
Générer une CA et des certificats client (OpenSSL)
Créer une CA minimale :
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ca.key
openssl req -x509 -new -key ca.key -days 3650 -out ca.crt -subj "/CN=EXAMPLE-CLIENT-CA"
Générer un certificat client :
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out client.key
openssl req -new -key client.key -out client.csr -subj "/CN=alice"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -out client.crt -extfile <(printf "extendedKeyUsage=clientAuth")
Option PKCS#12 pour import navigateur :
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -out client.p12
Activer mTLS avec Nginx
Configuration type :
server {
listen 443 ssl http2;
server_name exemple.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
# mTLS (vérifie le client)
ssl_client_certificate /etc/ssl/ca-clients.pem; # chaîne CA clients
ssl_verify_client on; # on | optional | optional_no_ca
ssl_verify_depth 2;
location / {
proxy_pass http://127.0.0.1:8080;
# En-têtes d’identité TLS côté amont (optionnel)
proxy_set_header X-TLS-Client-CN $ssl_client_s_dn;
proxy_set_header X-TLS-Verified $ssl_client_verify;
}
}
Déboguer côté Nginx :
error_log /var/log/nginx/error.log info;
Activer mTLS avec Apache (mod_ssl)
Configuration type :
<VirtualHost *:443>
ServerName exemple.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/fullchain.pem
SSLCertificateKeyFile /etc/ssl/private/privkey.pem
# mTLS
SSLCACertificateFile /etc/ssl/ca-clients.pem # CA qui signe les clients
SSLVerifyClient require # none|optional|require
SSLVerifyDepth 2
<Location "/">
Require all granted
RequestHeader set X-TLS-Client-CN "%{SSL_CLIENT_S_DN}s"
RequestHeader set X-TLS-Verified "%{SSL_CLIENT_VERIFY}s"
</Location>
</VirtualHost>
Activer modules requis :
a2enmod ssl headers
systemctl reload apache2
Révocation : CRL et OCSP (stapling)
CRL (fichier) :
# Nginx
ssl_crl /etc/ssl/crl/clients.crl;
# Apache
SSLCARevocationFile /etc/ssl/crl/clients.crl
OCSP stapling (serveur) :
# Nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
# Apache
SSLUseStapling On
SSLStaplingCache "shmcb:/var/run/ocsp(128000)"
Bonnes pratiques et dépannage
- Scope : n’activer mTLS que sur les endpoints sensibles (admin/API).
- UX : côté navigateur, faciliter l’import PKCS#12 (
.p12). - Sécurité : limiter
ssl_verify_depth, tenir à jour la CRL. - Observabilité : journaliser
$ssl_client_verify, CN, SAN; exporter en métriques. - Tests :
curl --cert client.crt --key client.key https://exemple.com. - Fallback :
ssl_verify_client optionalle temps de la transition.
Ressources complémentaires
- Créez les certificats avec Certbot
- Sécurisez vos API avec mTLS
- Utilisez Vault pour gérer les certificats
Conclusion
Le mTLS renforce fortement l'authentification sur vos services web.
Avec une CA maîtrisée, CRL/OCSP et un déploiement ciblé, vous obtenez un contrôle d’accès robuste et sans mot de passe pour vos utilisateurs et microservices.


