Problema

Muchas organizaciones siguen ejecutando APIs y web‑apps en Azure App Service, Functions o Logic Apps que negocian TLS 1.0 o TLS 1.1. Con la retirada programada de esas versiones, cualquier cliente que no acepte TLS 1.2 o superior recibe errores de conexión (handshake failure, 403, etc.). El síntoma típico es un aumento repentino de fallos en los logs de Application Insights o en los monitores de red, sin cambios recientes en el código.

Causa

  1. Configuración implícita del runtime – Algunas versiones de .NET, Java o Node.js siguen usando el protocolo predeterminado del SO, que en máquinas Windows Server 2016/2019 incluye TLS 1.0/1.1.
  2. Dependencias externas – SDKs o librerías de terceros que fijan explícitamente la versión de TLS al crear sockets.
  3. Entornos de prueba – En entornos de staging o dev se suele permitir TLS 1.0 para compatibilidad con herramientas legacy; al pasar a producción el mismo artefacto hereda la configuración.
  4. Configuración de Azure Front Door / Application Gateway – Si el frontend termina la TLS antes de pasar el tráfico al backend, una regla que permite TLS 1.0 en el listener puede ocultar el problema hasta que el frontend se actualice.

Solución

1. Auditar el uso de TLS

  • Application Insights: crea una query en Log Analytics que filtre por clientProtocol != “TLS1.2”.
  • Network Watcher: habilita el Connection Monitor entre el cliente y el endpoint para capturar la versión negociada.
  • Azure CLI: usa az webapp config show y revisa la propiedad minTlsVersion.

2. Forzar TLS 1.2 en el recurso de Azure

App Service y Function Apps

az webapp config set \
  --resource-group MyResourceGroup \
  --name MyApp \
  --min-tls-version 1.2

Este comando actualiza la configuración del plan y obliga a que el runtime solo acepte TLS 1.2 o superior.

Logic Apps (Standard)

az logic workflow update \
  --resource-group MyResourceGroup \
  --name MyLogicApp \
  --set properties.integrationServiceEnvironment.properties.minTlsVersion=1.2

3. Actualizar el runtime o la librería

  • .NET: agrega AppContext.SetSwitch("System.Net.DisableLegacyTLS", true); o actualiza a .NET 6/7 donde TLS 1.2 es predeterminado.
  • Java: incluye -Dhttps.protocols=TLSv1.2 en la línea de comandos o configura SSLContext en el código.
  • Node.js: establece process.env.NODE_TLS_REJECT_UNAUTHORIZED = '1'; y verifica que la versión de Node sea ≥ 12, que desactiva TLS 1.0/1.1 por defecto.

4. Revisar front‑ends

  • Azure Front Door: en el portal, verifica que el Frontend host tenga Minimum TLS version = 1.2.
  • Application Gateway: en la configuración del listener, cambia Protocol SettingsMinimum TLS version a 1.2.

5. Pruebas de regresión

  • Ejecuta pruebas de carga contra el endpoint usando curl con la opción --tlsv1.2.
  • Valida que los clientes internos (por ejemplo, microservicios) también hayan actualizado sus stacks.

6. Automatizar la detección

Incluye una regla de Azure Policy que rechace despliegues donde minTlsVersion sea inferior a 1.2:

{
  "if": {
    "allOf": [
      {
        "field": "type",
        "equals": "Microsoft.Web/sites"
      },
      {
        "field": "Microsoft.Web/sites/minTlsVersion",
        "notEquals": "1.2"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

Aplica la política a la suscripción o al grupo de recursos para evitar retrocesos.

Cuándo aplicar esta solución

  • Síntomas: errores de handshake en logs, caída de tráfico justo después del anuncio de retirada de TLS 1.0/1.1, o alertas de seguridad que indican uso de protocolos obsoletos.
  • Entornos: cualquier App Service, Function App o Logic App que exponga HTTPS al público o a otros servicios internos.
  • Exclusiones: sistemas aislados que solo se comunican mediante VPN y donde el túnel ya fuerza TLS 1.2; en esos casos la configuración del recurso puede dejarse sin cambios.

Código

# Forzar TLS 1.2 en App Service / Function App
az webapp config set \
  --resource-group MyResourceGroup \
  --name MyApp \
  --min-tls-version 1.2

# Verificar la versión mínima configurada
az webapp config show \
  --resource-group MyResourceGroup \
  --name MyApp \
  --query minTlsVersion -o tsv

# Actualizar Logic App (Standard) a TLS 1.2
az logic workflow update \
  --resource-group MyResourceGroup \
  --name MyLogicApp \
  --set properties.integrationServiceEnvironment.properties.minTlsVersion=1.2

Verificación

  1. Log Analytics: ejecuta requests | where clientProtocol != "TLS1.2" y confirma que el resultado es vacío.
  2. cURL test: curl -v --tlsv1.2 https://myapp.azurewebsites.net debe terminar con SSL connection using TLSv1.2.
  3. Azure Portal: revisa la pestaña TLS/SSL settings del App Service y verifica que Minimum TLS Version muestra 1.2.
  4. Policy compliance: en PolicyCompliance, el recurso debe aparecer como Compliant bajo la regla de TLS.

Notas adicionales

  • Algunas librerías de terceros (por ejemplo, versiones antiguas de HttpClient en Java) ignoran la configuración del runtime; actualiza siempre a la última versión disponible.
  • Si tu aplicación depende de clientes que no pueden migrar a TLS 1.2 (por ejemplo, dispositivos IoT legacy), considera colocar un Azure API Management delante del backend y habilitar TLS 1.2 solo en el frontend, manteniendo TLS 1.0 en la ruta interna controlada.
  • Después de aplicar los cambios, monitoriza el Error rate en Application Insights durante al menos 24 h; un pico inesperado suele indicar que algún cliente quedó fuera de la actualización.