Infrastructure

Azure Application Gateway : valider un certificat Key Vault avant rotation

Un runbook de production pour qualifier la rotation d'un certificat TLS Application Gateway depuis Key Vault avec identite managée, listener, WAF, probes, logs, validation et rollback.

08 juil. 2026 azureapplication-gatewaykey-vaulttlscertificatemanaged-identitywafobservabilitykqlrunbookrollbackproduction

Une rotation de certificat TLS sur Application Gateway ressemble souvent à une opération simple : déposer une nouvelle version dans Key Vault, attendre la synchronisation, vérifier le listener, puis fermer le ticket. En production, c’est rarement suffisant. Un mauvais secret, une identité managée sans droit, une chaîne incomplète, un listener qui garde l’ancienne version ou une probe qui échoue après bascule peuvent transformer une rotation préventive en incident frontal.

Le cas d’usage est une application exposée par Azure Application Gateway, parfois avec WAF, dont le certificat est stocké dans Azure Key Vault. L’équipe doit remplacer ou renouveler le certificat avant expiration sans casser le chemin HTTPS, sans ouvrir le coffre trop largement et sans confondre problème TLS, backend health, WAF ou DNS. Le but du runbook est de décider si la rotation peut partir, si elle doit attendre, ou si le rollback doit rétablir la version précédente du certificat.

Nommer le chemin TLS à protéger

Commencez par isoler un hostname et un listener. Une rotation de certificat ne se valide pas au niveau “gateway” en général : elle se valide sur le chemin réellement consommé par les utilisateurs, les probes et les dépendances.

text certificate-rotation-contract.txt
Rotation a qualifier
Application Gateway: agw-prod-edge
Hostname: app.example.com
Listener: https-app-prod
Key Vault: kv-prod-platform
Certificat: app-example-com
Identite d'acces: user-assigned managed identity de la gateway
Fenetre: rotation preventive avant expiration
Chemins a valider: navigateur, probe synthetique, backend health, WAF logs

Preuves requises avant bascule
Version actuelle du certificat et date d'expiration
Nouvelle version presente dans Key Vault
Chaine intermediaire et SAN verifies
Droit de lecture secret pour l'identite de la gateway
Listener associe au bon certificat
Probe externe avec SNI et hostname reels
Rollback vers l'ancienne version documente

Si le ticket ne contient pas le hostname, le listener et la version de certificat visée, la rotation n’est pas encore une opération contrôlable.

Séparer expiration, contenu et accès au coffre

Trois pannes se ressemblent : le certificat expire, le nouveau certificat est incorrect, ou Application Gateway ne peut pas le lire. Les diagnostics doivent donc séparer les dates, le contenu et l’accès Key Vault.

bash 01-key-vault-certificate-check.sh
RESOURCE_GROUP="rg-prod-network"
KEY_VAULT="kv-prod-platform"
CERT_NAME="app-example-com"

az keyvault certificate show --vault-name "$KEY_VAULT" --name "$CERT_NAME" --query "{name:name,enabled:attributes.enabled,notBefore:attributes.notBefore,expires:attributes.expires,secretId:sid}" --output table

az keyvault certificate list-versions --vault-name "$KEY_VAULT" --name "$CERT_NAME" --query "[].{version:id,enabled:attributes.enabled,expires:attributes.expires,created:attributes.created}" --output table

Gardez l’identifiant de version dans la note de changement. Un nom de certificat seul ne suffit pas pour expliquer ce qui a été présenté avant, pendant et après la rotation.

Vérifier l’identité managée de la gateway

Application Gateway doit pouvoir lire le secret associé au certificat. Une rotation peut échouer alors que le certificat est valide si l’identité managée n’a plus le droit, si le coffre a changé de modèle d’autorisation ou si une policy a modifié l’accès.

bash 02-gateway-identity-keyvault-access.sh
APP_GW_ID="/subscriptions/<subscription-id>/resourceGroups/rg-prod-network/providers/Microsoft.Network/applicationGateways/agw-prod-edge"
IDENTITY_PRINCIPAL_ID="11111111-1111-1111-1111-111111111111"
KEY_VAULT_SCOPE="/subscriptions/<subscription-id>/resourceGroups/rg-prod-platform/providers/Microsoft.KeyVault/vaults/kv-prod-platform"

az network application-gateway show --ids "$APP_GW_ID" --query "{identity:identity,sslCertificates:sslCertificates[].{name:name,keyVaultSecretId:keyVaultSecretId}}" --output json

az role assignment list --assignee "$IDENTITY_PRINCIPAL_ID" --scope "$KEY_VAULT_SCOPE" --query "[].{role:roleDefinitionName,scope:scope}" --output table

La correction ne doit pas être d’ajouter un rôle large au niveau subscription pour “débloquer” la rotation. Le bon périmètre est la lecture du secret nécessaire, avec une preuve que la gateway utilise bien cette identité.

Lire le listener avant de toucher au WAF

Un échec HTTPS peut déclencher des alertes WAF, des probes en erreur ou des 502 côté client. Ne modifiez pas les règles WAF tant que le listener TLS n’est pas compris.

bash 03-application-gateway-listener-check.sh
RESOURCE_GROUP="rg-prod-network"
APP_GW="agw-prod-edge"

az network application-gateway http-listener list --resource-group "$RESOURCE_GROUP" --gateway-name "$APP_GW" --query "[].{name:name,hostNames:hostNames,protocol:protocol,sslCertificate:sslCertificate.id,frontendIP:frontendIPConfiguration.id}" --output table

az network application-gateway ssl-cert list --resource-group "$RESOURCE_GROUP" --gateway-name "$APP_GW" --query "[].{name:name,keyVaultSecretId:keyVaultSecretId,provisioningState:provisioningState}" --output table

Si plusieurs listeners partagent le même certificat, listez-les explicitement. Une rotation peut être valide pour le hostname principal et casser un alias oublié.

Tester le certificat comme un client

La validation doit sortir du portail. Testez le hostname, le SNI, la chaîne et la date réellement servis par Application Gateway depuis un réseau représentatif.

bash 04-tls-probe.sh
HOSTNAME="app.example.com"

openssl s_client -connect "${HOSTNAME}:443" -servername "$HOSTNAME" -showcerts </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

curl -vkI "https://${HOSTNAME}/health" --resolve "${HOSTNAME}:443:<application-gateway-public-or-private-ip>" --max-time 10

Le test doit utiliser le vrai hostname. Une validation sur adresse IP, sans SNI, peut passer à côté du listener réellement utilisé en production.

Corréler logs gateway, WAF et probes

Pendant la fenêtre de rotation, gardez une vue courte sur les logs. Cherchez les erreurs de handshake, les changements de backend health, les réponses 502 et les blocages WAF qui apparaissent après la bascule.

kusto 05-application-gateway-rotation-watch.kql
let rotationStart = datetime(2026-07-08T18:00:00Z);
let rotationEnd = datetime(2026-07-08T19:00:00Z);
AzureDiagnostics
| where TimeGenerated between (rotationStart .. rotationEnd)
| where ResourceProvider == "MICROSOFT.NETWORK"
| where Category in ("ApplicationGatewayAccessLog", "ApplicationGatewayFirewallLog", "ApplicationGatewayPerformanceLog")
| extend host = coalesce(host_s, originalHost_s, requestUri_s)
| where host has "app.example.com"
| summarize
  requests=count(),
  errors=countif(httpStatus_d >= 500),
  wafBlocks=countif(action_s =~ "Blocked"),
  sampleStatus=make_set(tostring(httpStatus_d), 10)
by bin(TimeGenerated, 5m), Category
| order by TimeGenerated asc

Un pic de WAF blocks après rotation peut être corrélé, mais il n’est pas forcément causé par le certificat. Gardez la preuve TLS séparée de la preuve applicative.

Décider rotation, attente ou rollback

La décision doit être lisible par l’exploitation. La rotation peut partir quand l’accès Key Vault, le listener, la chaîne TLS et les probes sont validés. Elle doit attendre si une seule de ces preuves manque.

text certificate-rotation-decision.txt
Autoriser la rotation
La nouvelle version est active dans Key Vault
La chaine certificat est complete et couvre le hostname
L'identite managée de la gateway lit le secret au bon scope
Le listener pointe vers le certificat attendu
La probe TLS avec SNI passe depuis un réseau représentatif
Les logs gateway et WAF restent dans l'enveloppe attendue

Attendre avant rotation
La version cible n'est pas identifiee
Le certificat ne contient pas le SAN requis
L'identite gateway n'a pas un acces borne au secret
Plusieurs listeners consommateurs ne sont pas inventoriés
Les probes ou logs ne permettent pas de valider la bascule

Rollbacker
La gateway ne présente pas le nouveau certificat
Les clients voient une erreur de chaine ou de nom
Les probes HTTPS échouent après bascule
Les 502 augmentent sans autre changement applicatif
L'ancienne version est encore disponible et validée

Le rollback doit être aussi précis que la rotation : revenir à l’ancienne version du secret ou au précédent certificat configuré sur la gateway, puis refaire les probes TLS et applicatives. Ne rollbackez pas un changement WAF ou DNS pour corriger un certificat sans preuve.

Garder une trace réutilisable

Après la fenêtre, conservez le résultat sous forme de preuve d’exploitation. Cela évite de redécouvrir le même chemin à chaque renouvellement.

markdown certificate-rotation-evidence.md
## TLS certificate rotation evidence

- Hostname: app.example.com
- Application Gateway listener: https-app-prod
- Key Vault certificate: app-example-com
- Previous version: <secret-version-id>
- New version: <secret-version-id>
- Gateway identity: user-assigned managed identity
- Access proof: secret read role scoped to Key Vault
- TLS probe: SNI, SAN, issuer and expiry validated
- Application probe: /health returned expected status
- Logs: no new 5xx or WAF block pattern during watch window
- Decision: rotation promoted, rollback version retained until next window

Cette trace doit rester attachée au changement, pas seulement au ticket de renouvellement. Elle servira au prochain incident TLS, à la prochaine rotation et aux revues de sécurité.

Conclusion

Une rotation de certificat Application Gateway n’est pas un simple remplacement de secret. C’est une opération de production qui traverse Key Vault, identité managée, listener TLS, WAF, probes et observabilité.

La bonne décision repose sur des preuves courtes : version cible connue, accès au coffre borné, chaîne TLS valide, listener vérifié, probes réelles et rollback prêt. Quand ces éléments sont visibles, la rotation devient répétable. Quand ils manquent, l’équipe doit attendre plutôt que découvrir le problème au premier handshake client.