Contexto
La extension NPS (Network Policy Server) de Azure MFA utiliza un certificado autofirmado para autenticarse contra Azure AD. Este certificado tiene una validez limitada y debe renovarse periodicamente para evitar que la autenticacion RADIUS con MFA deje de funcionar.
El proceso no es un simple "renovar certificado" — requiere actualizar la extension, habilitar TLS 1.2 a nivel de sistema (obligatorio desde 2024), instalar .NET Framework actualizado y regenerar el certificado con el script oficial de Microsoft.
Aplica a: Windows Server 2019 con NPS + Azure MFA Extension.
Prerequisitos
- Acceso administrador local al servidor NPS
- Cuenta con rol Global Administrator en Azure AD (para el registro del certificado)
- Conectividad a Internet desde el servidor
- Ventana de mantenimiento (requiere reinicio del servicio NPS y del servidor)
Procedimiento paso a paso
Paso 1: Descargar el software actualizado
Descarga la ultima version de la extension NPS de Azure MFA desde el portal de Microsoft y copiala a C:\temp en el servidor.
# Verificar la version actual instalada
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\AzureMfa" | Select-Object -Property *Paso 2: Instalar la extension actualizada
Ejecuta el instalador descargado en C:\temp:
# Instalar la extension (GUI o silencioso)
Start-Process "C:\temp\NpsExtnForAzureMfaInstaller.exe" -WaitNota: Si tienes una version anterior, el instalador la actualizara automaticamente.
Paso 3: Habilitar TLS 1.2 en el servidor
Azure AD requiere TLS 1.2 para todas las comunicaciones. En Windows Server 2019 puede no estar habilitado por defecto en todas las capas. Este script configura TLS 1.2 en WinHTTP, Schannel y .NET Framework:
# =============================================================================
# Enable-TLS12.ps1 - Habilitar TLS 1.2 en todas las capas del sistema
# Ejecutar como Administrador
# =============================================================================
# --- WinHTTP ---
# Necesario para que las llamadas HTTP del sistema usen TLS 1.2
# Valor 0x800 = TLS 1.2
New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp' `
-Name 'DefaultSecureProtocols' -Value 0x800 -PropertyType 'DWord' -Force | Out-Null
# Para aplicaciones 32-bit en SO 64-bit (descomentar si aplica):
# New-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp' `
# -Name 'DefaultSecureProtocols' -Value 0x800 -PropertyType 'DWord' -Force | Out-Null
Write-Host "[OK] WinHTTP configurado para TLS 1.2" -ForegroundColor Green
# --- Schannel (Server + Client) ---
# Habilita TLS 1.2 tanto para conexiones entrantes (Server) como salientes (Client)
$basePath = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2'
# Server
New-Item "$basePath\Server" -Force | Out-Null
New-ItemProperty -Path "$basePath\Server" -Name 'Enabled' -Value 1 -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -Path "$basePath\Server" -Name 'DisabledByDefault' -Value 0 -PropertyType 'DWord' -Force | Out-Null
# Client
New-Item "$basePath\Client" -Force | Out-Null
New-ItemProperty -Path "$basePath\Client" -Name 'Enabled' -Value 1 -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -Path "$basePath\Client" -Name 'DisabledByDefault' -Value 0 -PropertyType 'DWord' -Force | Out-Null
Write-Host "[OK] Schannel TLS 1.2 habilitado (Server + Client)" -ForegroundColor Green
# --- .NET Framework ---
# Fuerza a .NET a usar el protocolo mas fuerte disponible (TLS 1.2)
New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' `
-Name 'SchUseStrongCrypto' -Value 1 -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v2.0.50727' `
-Name 'SchUseStrongCrypto' -Value 1 -PropertyType 'DWord' -Force | Out-Null
# Para aplicaciones 32-bit en SO 64-bit (descomentar si aplica):
# New-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' `
# -Name 'SchUseStrongCrypto' -Value 1 -PropertyType 'DWord' -Force | Out-Null
# New-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v2.0.50727' `
# -Name 'SchUseStrongCrypto' -Value 1 -PropertyType 'DWord' -Force | Out-Null
Write-Host "[OK] .NET Framework configurado para Strong Crypto" -ForegroundColor Green
Write-Host ""
Write-Host "[!] REINICIO REQUERIDO para aplicar cambios de Schannel" -ForegroundColor YellowPaso 4: Instalar .NET Framework 8.0
La extension actualizada requiere .NET Framework 8.0 (o el runtime correspondiente):
# Descargar e instalar .NET 8.0 Runtime (si no esta ya)
# https://dotnet.microsoft.com/en-us/download/dotnet/8.0
Start-Process "C:\temp\dotnet-runtime-8.0.x-win-x64.exe" -ArgumentList "/install /quiet /norestart" -WaitPaso 5: Reiniciar el servidor
# Reinicio obligatorio para que apliquen los cambios de TLS en Schannel
Restart-Computer -ForceImportante: Sin reinicio, las claves de registro de Schannel no surten efecto y la extension NPS no podra comunicar con Azure AD.
Paso 6: Regenerar el certificado con el script oficial
Despues del reinicio, ejecuta el script de configuracion de Microsoft que genera un nuevo certificado autofirmado y lo registra en Azure AD:
# Ejecutar como Administrador
& "C:\Program Files\Microsoft\AzureMfa\Config\AzureMfaNpsExtnConfigSetup.ps1"El script realizara las siguientes acciones automaticamente:
- Instalara el modulo
Microsoft.Graphsi no esta presente - Te pedira autenticacion con Global Admin (ventana de login de Microsoft)
- Generara un nuevo certificado autofirmado
- Registrara el certificado en el Service Principal de Azure MFA (
981f26a1-7f43-403b-a875-f8b09b8cd720) - Actualizara el registro con el thumbprint del nuevo certificado
- Otorgara permisos de lectura de la clave privada a
NETWORK SERVICE - Reiniciara el servicio IAS (NPS)
Paso 7: Eliminar certificados obsoletos
Una vez confirmado que la autenticacion MFA funciona con el nuevo certificado, elimina los antiguos:
# Listar certificados de Azure MFA
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.Subject -like "*Azure*MFA*" -or $_.Subject -like "*tenant*"
} | Format-Table Subject, NotAfter, Thumbprint -AutoSize
# Eliminar los expirados (verificar thumbprint antes)
$oldCerts = Get-ChildItem Cert:\LocalMachine\My | Where-Object {
($_.Subject -like "*Azure*MFA*" -or $_.Subject -like "*tenant*") -and
$_.NotAfter -lt (Get-Date)
}
foreach ($cert in $oldCerts) {
Write-Host "Eliminando: $($cert.Subject) (expiro: $($cert.NotAfter))" -ForegroundColor Yellow
Remove-Item "Cert:\LocalMachine\My\$($cert.Thumbprint)" -Force
}
Write-Host "[OK] Certificados obsoletos eliminados" -ForegroundColor GreenPaso 8: Verificar funcionamiento
# Verificar que el servicio NPS esta corriendo
Get-Service ias | Select-Object Status, DisplayName
# Verificar el certificado activo
$certId = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\AzureMfa" -Name "CLIENT_CERT_IDENTIFIER"
Write-Host "Certificado activo: $($certId.CLIENT_CERT_IDENTIFIER)"
# Verificar conectividad con Azure (debe devolver 200 o redirect)
Invoke-WebRequest -Uri "https://adnotifications.windowsazure.com" -UseBasicParsing -TimeoutSec 10 | Select-Object StatusCodePrueba una autenticacion RADIUS real desde un cliente (VPN, WiFi, etc.) para confirmar que el MFA funciona end-to-end.
Troubleshooting
| Problema | Causa probable | Solucion |
|---|---|---|
Connect-MgGraph falla | TLS 1.2 no activo o falta modulo | Verificar reinicio post-TLS, ejecutar Install-Module Microsoft.Graph |
| Error "tenant not found" | Tenant ID incorrecto en registro | Verificar HKLM:\SOFTWARE\Microsoft\AzureMfa\TENANT_ID |
| MFA no responde tras renovacion | Certificado no registrado en Azure | Re-ejecutar el script de configuracion |
| Servicio IAS no arranca | .NET Framework no instalado | Instalar .NET 8.0 runtime |
| Timeout en autenticacion RADIUS | Firewall bloqueando salida a Azure | Permitir HTTPS saliente a *.windowsazure.com, login.microsoftonline.com |
Referencia rapida (resumen de comandos)
# 1. Instalar extension actualizada
Start-Process "C:\temp\NpsExtnForAzureMfaInstaller.exe" -Wait
# 2. Habilitar TLS 1.2 (ejecutar script Enable-TLS12.ps1 de arriba)
# 3. Instalar .NET 8.0
Start-Process "C:\temp\dotnet-runtime-8.0.x-win-x64.exe" -ArgumentList "/install /quiet /norestart" -Wait
# 4. Reiniciar
Restart-Computer -Force
# 5. Regenerar certificado (post-reinicio)
& "C:\Program Files\Microsoft\AzureMfa\Config\AzureMfaNpsExtnConfigSetup.ps1"
# 6. Limpiar certificados viejos
Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*tenant*" -and $_.NotAfter -lt (Get-Date) } | Remove-ItemNotas
- El certificado autofirmado generado tiene validez de 2 anos por defecto
- Programa un recordatorio para renovarlo antes de que expire
- El script oficial de Microsoft (
AzureMfaNpsExtnConfigSetup.ps1) fue actualizado para usarMicrosoft.Graphen lugar del deprecadoAzureADmodule - En entornos con multiples servidores NPS, repite este proceso en cada uno
Comentarios