Inicio Linux & Systems Cybersecurity Cloud & DevOps Networks & Infrastructure SIEM & Monitoring DFIR & Threat Intel Development & Other Todas las categorias Herramientas

Renovar certificado NPS con Azure MFA en Windows Server 2019

Renovar certificado NPS con Azure MFA en Windows Server 2019

Tabla de contenidos

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.

POWERSHELL
# 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:

POWERSHELL
# Instalar la extension (GUI o silencioso)
Start-Process "C:\temp\NpsExtnForAzureMfaInstaller.exe" -Wait

Nota: 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:

POWERSHELL
# =============================================================================
# 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 Yellow

Paso 4: Instalar .NET Framework 8.0

La extension actualizada requiere .NET Framework 8.0 (o el runtime correspondiente):

POWERSHELL
# 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" -Wait

Paso 5: Reiniciar el servidor

POWERSHELL
# Reinicio obligatorio para que apliquen los cambios de TLS en Schannel
Restart-Computer -Force

Importante: 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:

POWERSHELL
# Ejecutar como Administrador
& "C:\Program Files\Microsoft\AzureMfa\Config\AzureMfaNpsExtnConfigSetup.ps1"

El script realizara las siguientes acciones automaticamente:

  1. Instalara el modulo Microsoft.Graph si no esta presente
  2. Te pedira autenticacion con Global Admin (ventana de login de Microsoft)
  3. Generara un nuevo certificado autofirmado
  4. Registrara el certificado en el Service Principal de Azure MFA (981f26a1-7f43-403b-a875-f8b09b8cd720)
  5. Actualizara el registro con el thumbprint del nuevo certificado
  6. Otorgara permisos de lectura de la clave privada a NETWORK SERVICE
  7. 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:

POWERSHELL
# 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 Green

Paso 8: Verificar funcionamiento

POWERSHELL
# 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 StatusCode

Prueba una autenticacion RADIUS real desde un cliente (VPN, WiFi, etc.) para confirmar que el MFA funciona end-to-end.


Troubleshooting

ProblemaCausa probableSolucion
Connect-MgGraph fallaTLS 1.2 no activo o falta moduloVerificar reinicio post-TLS, ejecutar Install-Module Microsoft.Graph
Error "tenant not found"Tenant ID incorrecto en registroVerificar HKLM:\SOFTWARE\Microsoft\AzureMfa\TENANT_ID
MFA no responde tras renovacionCertificado no registrado en AzureRe-ejecutar el script de configuracion
Servicio IAS no arranca.NET Framework no instaladoInstalar .NET 8.0 runtime
Timeout en autenticacion RADIUSFirewall bloqueando salida a AzurePermitir HTTPS saliente a *.windowsazure.com, login.microsoftonline.com

Referencia rapida (resumen de comandos)

POWERSHELL
# 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-Item

Notas

  • 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 usar Microsoft.Graph en lugar del deprecado AzureAD module
  • En entornos con multiples servidores NPS, repite este proceso en cada uno

Comentarios