Aller au contenu

mTLS

Authentification mutuelle entre services — chaque composant prouve son identité.


TLS vs mTLS

Dans un TLS classique, seul le serveur présente un certificat. Le client vérifié l'identité du serveur, mais le serveur ne sait pas qui est le client. Dans un contexte de microservices ou le réseau interne ne peut pas être considéré comme sur, cette asymétrie est un risque.

Le mTLS (mutual TLS) exige que les deux parties presentent et valident un certificat. Chaque service a une identité cryptographique prouvable. Un service qui ne peut pas présenter un certificat valide est refuse — même s'il est sur le même réseau, dans le même cluster, dans le même namespace.

sequenceDiagram
    participant A as Service A
    participant B as Service B

    A->>B: ClientHello
    B->>A: ServerHello + certificat serveur
    A->>A: Verifier certificat serveur (CA interne)
    A->>B: Certificat client
    B->>B: Verifier certificat client (CA interne)
    A->>B: Communication chiffree etablie
    B->>A: Reponse chiffree

La différence fondamentale : en TLS classique, le serveur est vérifié. En mTLS, les deux parties sont verifiees. C'est la base de l'identité de workload dans un modèle zero trust.


Architecture PKI interne

Le mTLS à l'échelle nécessité une infrastructure a clés publiques (PKI) interne. Les certificats publics (Let's Encrypt, DigiCert) ne sont pas adaptés à l'authentification de workloads internes — ils valident des noms de domaine publics, pas des identités de services.

Composants d'une PKI interne

graph TD
    ROOT["Root CA\n(offline, HSM)"]
    INT["Intermediate CA\n(operationnelle)"]
    SVC1["Certificat\nService A"]
    SVC2["Certificat\nService B"]
    SVC3["Certificat\nService C"]

    ROOT --text--> INT
    INT --text--> SVC1
    INT --text--> SVC2
    INT --text--> SVC3

Root CA — l'autorité de certification racine. Elle signe l'intermediate CA, jamais directement les certificats de service. Stockee offline, idealement dans un HSM (Hardware Security Module). Sa compromission invalide toute la chaîne de confiance.

Intermediate CA — l'autorité opérationnelle qui emet les certificats de service. Si elle est compromise, on la revoque et on en deploie une nouvelle sans toucher à la root CA. En production, on peut avoir plusieurs intermediate CA pour des environnements différents (production, staging, dev).

Certificats de service — emis par l'intermediate CA, identifiés par un SAN (Subject Alternative Name) ou un SPIFFE ID. Durée de vie courte, rotation automatique.

Hiérarchie a deux niveaux

La hiérarchie a deux niveaux (root + intermediate) est le minimum recommande. Elle offre :

  • Isolation — la root CA reste offline et protégée
  • Rotation — on peut renouveler l'intermediate CA sans changer la root
  • Segmentation — une intermediate CA par environnement ou par équipe
  • Revocation — revoquer une intermediate CA n'affecte qu'une partie de l'infrastructure
Composant Durée de vie Stockage Rotation
Root CA 10-20 ans HSM, offline Manuelle, rare
Intermediate CA 1-5 ans Vault, cert-manager Planifiee, annuelle
Certificat workload 24h-7j Mémoire, volume secret Automatique

Gestion du cycle de vie des certificats

La complexité du mTLS reside dans la gestion des certificats à l'échelle. Avec des centaines de services, la gestion manuelle est impossible et dangereuse.

Émission

L'émission des certificats doit être automatisee. Un service ne devrait jamais avoir a demander manuellement un certificat. Au démarrage, le service reçoit automatiquement son certificat depuis la PKI.

Rotation

La rotation régulière limite l'impact d'une compromission. Un certificat avec une durée de vie de 24h compromis est exploitable pendant 24h au maximum. Un certificat avec une durée de vie de 1 an est exploitable pendant 1 an.

La rotation doit être transparente pour le service — pas de downtime, pas d'intervention manuelle. Le nouveau certificat est déployé avant l'expiration de l'ancien. Les deux coexistent brievement pour éviter les interruptions.

gantt
    title Rotation de certificat (overlap)
    dateFormat HH:mm
    section Cert A
    Actif           :a1, 00:00, 24h
    section Cert B
    Emission        :b0, 22:00, 1h
    Actif           :b1, 23:00, 24h

Revocation

En cas de compromission d'un service, son certificat doit pouvoir être revoque immédiatement. Deux mécanismes :

CRL (Certificate Revocation List) — une liste de certificats revoques publiee périodiquement par la CA. Simple mais avec un délai — les clients ne verifient la CRL que périodiquement.

OCSP (Online Certificate Status Protocol) — vérification en temps réel du statut d'un certificat aupres de la CA. Plus reactif mais ajoute une dépendance réseau à chaque connexion.

OCSP Stapling — le serveur joint une réponse OCSP récente a sa réponse TLS, éliminant le besoin pour le client de contacter l'OCSP responder. Meilleur compromis performance/sécurité.

Mécanisme Délai de revocation Impact performance Dépendance réseau
CRL Heures (selon TTL) Faible Périodique
OCSP Temps réel Moyen Chaque connexion
OCSP Stapling Quasi temps réel Faible Périodique
Short-lived Inhérent (expiration) Nul Aucune

La tendance actuelle est aux certificats a durée de vie très courte (quelques heures) qui rendent la revocation quasi inutile — le certificat expire avant que la revocation ne soit nécessaire.


cert-manager et rotation automatique

cert-manager est le standard de facto pour la gestion des certificats dans Kubernetes. Il automatise l'émission, le renouvellement et la rotation des certificats TLS.

Architecture cert-manager

graph LR
    CM["cert-manager\ncontroller"] --text--> ISSUER["Issuer\n(Vault, self-signed, ACME)"]
    ISSUER --text--> CERT["Certificate"]
    CERT --text--> SECRET["Secret K8s\n(tls.crt + tls.key)"]
    POD["Pod applicatif"] --mount--> SECRET

Configuration type

# Issuer connecte a HashiCorp Vault
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: vault-issuer
spec:
  vault:
    server: https://vault.internal:8200
    path: pki/sign/workload
    auth:
      kubernetes:
        role: cert-manager
        mountPath: /v1/auth/kubernetes

---
# Certificat avec rotation automatique
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: order-service-tls
  namespace: production
spec:
  secretName: order-service-tls
  duration: 24h
  renewBefore: 4h
  issuerRef:
    name: vault-issuer
    kind: ClusterIssuer
  commonName: order-service
  dnsNames:
    - order-service
    - order-service.production.svc.cluster.local

Le champ renewBefore est critique — il définit la fenêtre de renouvellement. Avec duration: 24h et renewBefore: 4h, le certificat est renouvele 4 heures avant son expiration, garantissant une continuite de service.


SPIFFE et identités de workload

SPIFFE (Secure Production Identity Framework For Everyone) définit un standard pour les identités de workload. Chaque workload reçoit un SPIFFE ID — un URI unique qui l'identifié independamment de son emplacement réseau.

Format : spiffe://trust-domain/path

Exemple : spiffe://acme.com/production/order-service

SPIRE est l'implémentation de référence de SPIFFE. Il géré l'émission et la rotation des identités SPIFFE sous forme de certificats X.509 ou de JWT.

Concept Description
SPIFFE ID URI unique identifiant un workload
SVID Document d'identité (certificat X.509 ou JWT)
Trust domain Domaine de confiance (organisation, cluster)
SPIRE Server Autorité qui emet les SVID
SPIRE Agent Agent local qui distribué les SVID aux workloads

Quand utiliser le mTLS

Le mTLS est particulièrement adapté aux communications service-a-service dans un environnement de microservices. Pour les communications client-serveur (navigateur, app mobile), il n'est généralement pas applicable — les clients ne disposent pas de certificats gérés centralement.

Approche hybride

Une approche hybride courante : mTLS entre tous les services internes, JWT ou OAuth2 pour les clients externes. Le JWT prouve l'identité de l'utilisateur, le mTLS prouve l'identité du service appelant.

graph LR
    BROWSER[Navigateur] --text--> GW[API Gateway]
    GW --text--> SVC_A[Service A]
    SVC_A --text--> SVC_B[Service B]
    SVC_B --text--> DB[(Database)]
Segment Authentification Mécanisme
Navigateur -> Gateway Utilisateur JWT/OAuth2 + TLS
Gateway -> Service A Workload mTLS
Service A -> Service B Workload mTLS
Service B -> Database Workload mTLS + credentials DB

Service mesh transparent

Le service mesh (Istio, Linkerd) peut prendre en charge le mTLS de façon transparente — sans modifier le code applicatif. Chaque sidecar proxy géré la negociation TLS, la vérification des certificats et le reporting.

Le mesh peut opérer en deux modes :

  • Permissif — mTLS optionnel pendant la migration (accepte les connexions non-mTLS)
  • Strict — mTLS obligatoire, les connexions non-mTLS sont refusees

Warning

Activer le mTLS sans rotation automatique des certificats crée une fausse sécurité. Un certificat qui expire et n'est pas renouvele coupe les communications en production. Automatisez la rotation avant d'activer le mode strict.


Debugging et observabilité mTLS

Le mTLS ajoute une couche de complexité au diagnostic des problèmes de communication entre services. Quelques outils et techniques pour faciliter le debugging.

Erreurs courantes

Symptome Cause probable Résolution
Connection refused Certificat expire, non renouvele Vérifier la rotation cert-manager, logs du controller
TLS handshake failure CA non reconnue par le client Vérifier que le trust bundle contient la bonne CA
Certificate unknown SAN incorrect dans le certificat Vérifier le champ dnsNames du Certificate
Permission denied Certificat valide mais politique d'autorisation Vérifier les AuthorizationPolicy du mesh

Outils de diagnostic

# Verifier le certificat d'un service (depuis un pod)
openssl s_client -connect order-service:8080 \
  -cert /certs/tls.crt -key /certs/tls.key \
  -CAfile /certs/ca.crt

# Inspecter un certificat
openssl x509 -in /certs/tls.crt -text -noout

# Verifier l'expiration
openssl x509 -in /certs/tls.crt -enddate -noout

Observabilité dans le service mesh

Avec un service mesh, le mTLS est transparent pour l'application mais visible dans les métriques du sidecar :

  • Connexions mTLS reussies / échouées — métriques Envoy/Linkerd
  • Certificats proches de l'expiration — alertes cert-manager
  • Handshake latency — impact du mTLS sur la latence des requêtes (généralement < 1ms après le premier handshake grâce au session resumption)

Le monitoring des certificats est critique. Une alerte doit se déclencher bien avant l'expiration — au minimum 2x la periode de renouvellement. Si renewBefore est a 4h, l'alerte doit se déclencher a 8h avant l'expiration.

Chapitre suivant : Supply chain security — garantir l'intégrité de la chaîne d'approvisionnement, de la source au déploiement.