Cloud

Azure APIM : diagnostiquer le TLS backend avant de désactiver la validation du certificat

Un runbook de production pour séparer chaîne de confiance, hostname, SNI, expiration, protocole TLS et configuration APIM avant toute désactivation de validation du certificat backend.

05 sept. 2026 azureapi-managementapimtlscertificatessecurityobservabilitykqlautomationrunbookrollbackproduction

Une API publiée par Azure API Management commence à retourner des 500 ou 502 alors que le backend répond lorsqu’il est appelé directement. Le certificat a été renouvelé quelques heures plus tôt. La correction proposée arrive vite : désactiver la validation de la chaîne ou du nom dans la configuration du backend APIM.

Cette option peut rétablir le trafic, mais elle supprime précisément le contrôle qui prouve qu’APIM parle au bon serveur. Le cas fil rouge est une API interne dont le backend HTTPS utilise un certificat d’entreprise. Le runbook doit distinguer chaîne incomplète, autorité non reconnue, hostname incorrect, certificat expiré, problème de protocole ou erreur applicative, puis décider entre correction du certificat, ajustement borné du backend, restauration de la version précédente ou rollback APIM.

Figer un appel témoin et la fenêtre de changement

Commencez par un appel reproductible sans données sensibles. Conservez son chemin, son opération APIM, son CorrelationId, la région de gateway, le code client, le code backend s’il existe et les horodatages UTC. Ajoutez un appel témoin vers une opération saine du même backend, ou vers la même opération sur une région non affectée.

yaml apim-backend-tls-incident.yml
incident: INC-APIM-214
first_seen_utc: 2026-09-05T13:20:00Z
last_known_success_utc: 2026-09-05T12:48:00Z

apim:
service: apim-platform-prod
api: orders-v2
operation: GET /orders/{id}
backend_id: orders-api-prod
gateway_region: westeurope

backend:
configured_url: https://orders-api.internal.example.net
expected_hostname: orders-api.internal.example.net
recent_change: backend-certificate-renewal

evidence:
- APIM gateway log and CorrelationId
- backend entity before and after the change
- certificate leaf and presented chain
- DNS answer from an approved probe path
- backend access log for the same timestamp
- last known APIM configuration and certificate version

Ne modifiez pas encore skipCertificateChainValidation ni skipCertificateNameValidation. Capturez leur valeur actuelle. Une exception déjà active change le diagnostic : APIM peut atteindre le backend tout en ne vérifiant plus une partie de son identité.

Prouver que l’échec se produit pendant le handshake

Un 502 vu par le client n’est pas une preuve TLS. APIM peut échouer avant l’appel backend, pendant la connexion, dans une policy, sur timeout, ou après une réponse invalide. Les journaux de gateway permettent de séparer ces étapes.

kusto apim-backend-tls-errors.kql
let incidentStart = datetime(2026-09-05T13:10:00Z);
let incidentEnd = datetime(2026-09-05T14:00:00Z);
ApiManagementGatewayLogs
| where TimeGenerated between (incidentStart .. incidentEnd)
| where ApiId == "orders-v2" or BackendId == "orders-api-prod"
| project TimeGenerated, CorrelationId, Region, OperationId,
        ResponseCode, BackendResponseCode, BackendTime, BackendUrl,
        LastErrorSource, LastErrorReason, LastErrorMessage
| order by TimeGenerated desc

Cherchez une erreur de connexion backend cohérente avec le renouvellement et comparez-la aux logs du serveur. Si le backend possède une requête portant le même identifiant ou le même instant, le handshake a probablement abouti : contrôlez alors le code HTTP, la policy et l’application. Si aucun BackendResponseCode n’existe et que l’erreur de gateway désigne la connexion ou le certificat, la piste TLS devient prioritaire.

Évitez de filtrer uniquement sur le texte exact d’une erreur. Les messages peuvent évoluer. La combinaison LastErrorSource, LastErrorReason, absence de réponse backend, région et début de l’incident est une preuve plus robuste.

Lire la configuration backend réellement déployée

Le backend effectif peut venir d’une entité APIM appelée par set-backend-service, d’une URL définie directement sur l’API, ou d’une policy conditionnelle. Exportez l’entité et les policies aux scopes global, produit, API et opération avant de conclure.

bash 01-export-apim-backend.sh
SUBSCRIPTION_ID="<subscription-id>"
RG="rg-api-platform-prod"
APIM="apim-platform-prod"
BACKEND_ID="orders-api-prod"
API_VERSION="2024-05-01"

BACKEND_URI="https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG}/providers/Microsoft.ApiManagement/service/${APIM}/backends/${BACKEND_ID}?api-version=${API_VERSION}"

az rest --method get --url "$BACKEND_URI" --query '{id:id,url:properties.url,protocol:properties.protocol,tls:properties.tls,credentials:properties.credentials}' --output json

az apim api policy show --resource-group "$RG" --service-name "$APIM" --api-id "orders-v2" --output json

Vérifiez l’URL complète, pas seulement le certificat attendu. Un backend configuré avec une IP, un alias DNS différent ou un ancien hostname peut présenter un certificat valide dont le nom ne correspond pas. Vérifiez aussi qu’une policy ne redirige pas certaines opérations vers une autre entité backend.

Séparer nom, chaîne, validité et protocole

Traitez le handshake comme quatre contrôles indépendants :

  • le nom demandé doit correspondre au SAN du certificat présenté ;
  • la chaîne présentée doit remonter vers une autorité approuvée par la gateway ;
  • chaque certificat utile doit être dans sa période de validité et adapté à l’usage serveur ;
  • le backend et APIM doivent partager une version et des paramètres TLS compatibles.

Depuis une machine de diagnostic autorisée à suivre un chemin réseau comparable, inspectez la résolution DNS et le certificat présenté avec le hostname réel. Ce test ne reproduit pas l’environnement managé d’APIM, mais il détecte rapidement un mauvais endpoint, un SAN absent ou une chaîne incomplète.

bash 02-inspect-backend-certificate.sh
HOST="orders-api.internal.example.net"
PORT="443"

getent ahosts "$HOST"

openssl s_client -connect "${HOST}:${PORT}" -servername "$HOST" -showcerts -verify_return_error </dev/null

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

Le paramètre -servername est important : sans SNI, un reverse proxy peut présenter le certificat par défaut et fabriquer un faux diagnostic. Testez ensuite avec la chaîne de confiance attendue si elle est privée. Une feuille correcte ne compense pas un intermédiaire absent ; le serveur doit généralement présenter les intermédiaires nécessaires.

Corréler le renouvellement au certificat servi

Un certificat peut être renouvelé dans Key Vault, dans le load balancer ou sur le serveur sans être celui effectivement présenté au trafic APIM. Comparez l’empreinte et la série observées sur chaque endpoint ou région avec l’objet attendu. Contrôlez aussi le moment de la bascule, la propagation et le comportement du pool backend.

Construisez une matrice courte :

text certificate-comparison.txt
Expected certificate
hostname and SAN
issuer and chain
serial or fingerprint
notBefore / notAfter
deployment target and version

Observed from approved probe
resolved IP
hostname sent as SNI
leaf serial or fingerprint
presented intermediates
verify return code

Observed by APIM
gateway region
backend URL and BackendId
first failure UTC
LastErrorReason and LastErrorMessage
backend response present: yes/no

Si une seule région APIM échoue, ne concluez pas immédiatement à un problème de confiance global. Vérifiez la réponse DNS et le certificat servi par les backends de cette région. Si toutes les régions échouent exactement après une modification APIM, comparez d’abord l’entité backend et les policies.

Choisir la correction la plus étroite

La correction dépend du contrôle qui échoue :

text apim-tls-decision.txt
Hostname absent du SAN
Corriger l'URL backend ou émettre un certificat pour le hostname réel
Ne pas désactiver la validation du nom pour masquer un alias mal conçu

Chaîne publique incomplète
Configurer le serveur pour présenter les intermédiaires nécessaires
Revalider depuis plusieurs chemins avant remise en trafic

Autorité privée attendue
Configurer la CA personnalisée selon le tier et le type de gateway utilisés
Prouver le périmètre de confiance et conserver la validation du nom

Certificat expiré ou mauvaise version servie
Restaurer le certificat précédent encore valide ou terminer le renouvellement
Vérifier chaque endpoint avant de retirer l'ancienne version

Paramètre TLS incompatible
Restaurer la dernière combinaison connue ou corriger le backend
Tester les clients à certificat séparément avant toute activation TLS 1.3

Erreur HTTP après handshake
Arrêter de modifier les certificats
Diagnostiquer policy, identité, timeout et application

Les mécanismes de CA personnalisée diffèrent entre gateways managées, self-hosted gateways et tiers APIM. Vérifiez le support du tier réel avant de préparer le changement. Une CA ajoutée au service managé ne prouve pas automatiquement que la même confiance existe sur une gateway self-hosted.

Encadrer toute exception temporaire

La désactivation de validation n’est acceptable que si l’architecture impose explicitement un certificat autosigné, que le tier le nécessite, et que le risque est compris. Elle doit cibler une entité backend précise, conserver autant de contrôles que possible et avoir une expiration, un propriétaire et un rollback. Ne désactivez pas simultanément chaîne et nom par commodité.

Avant l’exception, conservez l’objet backend complet. Après le changement, rejouez un appel positif et un appel négatif : le hostname légitime doit fonctionner, tandis qu’un backend voisin ou un nom non prévu ne doit pas devenir une cible valide. L’exception ne doit jamais servir à compenser une chaîne publique cassée ou un certificat expiré.

Valider le rollout et le rollback

Déployez d’abord sur une API ou une révision canari qui suit le même chemin. Corrélez l’appel de bout en bout, puis observez les erreurs TLS et les codes backend par région avant d’élargir.

text apim-tls-validation-gates.txt
Validation avant rollout
BackendId, URL et policies exportés
Certificat attendu et certificat servi concordent
SAN, chaîne, dates et protocole vérifiés
Cause visible dans les logs APIM
Appel témoin et test négatif définis
Objet de rollback prêt

Succès
Appel APIM retourne le code applicatif attendu
Backend reçoit le même CorrelationId
Aucun nouveau groupe d'erreurs TLS par région
Validation de chaîne et de nom restent actives, sauf exception approuvée

Rollback immédiat
Une région présente encore un certificat inattendu
Le test négatif devient joignable
Le backend effectif diffère de l'objet validé
L'exception TLS couvre plus d'APIs que prévu
Les erreurs changent de forme sans preuve de handshake réussi

Le rollback consiste à restaurer l’entité backend, la policy ou la version de certificat connue, puis à rejouer les mêmes preuves. Désactiver une API entière peut contenir le risque, mais ce n’est pas le retour arrière du changement TLS.

Conclusion

Une erreur APIM après renouvellement de certificat ne justifie pas de supprimer un contrôle TLS. Il faut d’abord prouver l’étape en échec, lire le backend effectif, tester le hostname avec SNI, reconstruire la chaîne et corréler le certificat réellement servi aux logs de gateway.

La décision devient alors simple à exploiter : corriger le SAN ou la chaîne, configurer une CA privée supportée, restaurer le certificat précédent, revenir sur un paramètre TLS, ou traiter une erreur applicative qui n’avait rien de TLS. La remise en production est valide lorsque l’appel positif passe, le test négatif reste bloqué et la validation du certificat reste explicable.