Problema

En entornos con AD CS y el rol NDES (Network Device Enrollment Service) es habitual que los dispositivos soliciten certificados a través del endpoint /mscep/mscep.dll. Cuando la extensión ISAPI de NDES no logra iniciar, IIS devuelve 500.0 – Internal Server Error y el código de error 0x80070057 (ERROR_INVALID_PARAMETER). El registro de eventos muestra mensajes como:

  • The Network Device Enrollment Service cannot be started (0x80070057).
  • The Network Device Enrollment Service cannot retrieve one of its required certificates (0x80070057).

El punto de ruptura típico ocurre en la función GetExtensionVersion dentro de mscep.dll. Si esta función devuelve FALSE, IIS descarta la extensión y nunca invoca HttpExtensionProc, lo que produce el error inmediato antes de que cualquier operación SCEP sea procesada.

Este patrón se repite en distintas versiones de Windows Server, tanto en instalaciones limpias como en servidores actualizados, y suele confundirse con problemas de certificados, permisos o configuración de IIS. La clave está en entender qué condiciones internas hacen que GetExtensionVersion falle.

Causa

1. Certificado RA no disponible o no válido para el rol

NDES necesita dos certificados RA (Registration Authority) con EKU específicos (CEP Encryption y Exchange Enrollment Agent). Si alguno falta, está revocado o su cadena no se puede construir, la función de inicialización aborta y devuelve FALSE.

2. Incompatibilidad del proveedor de claves (CSP vs KSP)

NDES está escrito para trabajar con el Microsoft Strong Cryptographic Provider (CSP). Cuando el certificado RA está asociado a un KSP (Key Storage Provider) moderno, la llamada a CryptAcquireContext falla y la extensión se cierra.

3. Registro corrupto de la extensión ISAPI

La ruta del DLL y la versión esperada se almacenan en:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\ISAPI\mscep.dll

Si el valor Version no coincide con la versión del binario o está dañado, GetExtensionVersion interpreta el parámetro como inválido.

4. Perfil del servicio o variables de entorno rotas

NDES se ejecuta bajo la cuenta de servicio configurada en el pool de aplicaciones. Si el perfil del usuario tiene claves de registro rotas (por ejemplo, User Shell Folders vacíos) o variables como TEMP y TMP apuntan a rutas inexistentes, la carga del certificado falla.

5. Interferencia de software de seguridad o control de integridad

Algunos EDR o módulos de protección de memoria interceptan la carga del DLL y alteran la tabla de funciones, provocando que la comprobación de firma digital dentro de GetExtensionVersion devuelva error.

6. Actualizaciones de Windows que introducen cambios en la API de extensión ISAPI

En versiones recientes de Windows Server, ciertas actualizaciones modifican la forma en que IIS valida los parámetros de GetExtensionVersion. Si el servidor tiene parches parciales o está en un estado de servicing incompleto, la función puede fallar sin generar un mensaje explícito.

Solución

Paso 1 – Verificar los certificados RA

  1. Abre la consola de certmgr.msc bajo la cuenta del pool de aplicaciones (puedes usar psexec -i -u "DOMAIN\svcAccount" cmd para abrir una sesión como ese usuario).
  2. Busca los certificados con los OIDs 1.3.6.1.4.1.311.20.2.2 (CEP Encryption) y 1.3.6.1.4.1.311.20.2.3 (Exchange Enrollment Agent).
  3. Confirma que:
    • No están revocados.
    • La cadena de confianza llega hasta la CA raíz.
    • El proveedor de claves es Microsoft Strong Cryptographic Provider (CSP).

Si alguno falla, vuelve a emitir el certificado usando una plantilla marcada explícitamente como “Legacy CSP”.

Paso 2 – Forzar el uso de CSP

Ejecuta el siguiente script para reasignar el KSP a CSP en los certificados RA:

certutil -repairstore my "<thumbprint_RA>"
certutil -setreg ca\csp "Microsoft Strong Cryptographic Provider"

Reinicia el pool de aplicaciones después de aplicar los cambios.

Paso 3 – Reparar el registro de la extensión ISAPI

  1. Elimina la clave existente:
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\ISAPI\mscep.dll" /f
  1. Vuelve a registrar el DLL con la versión correcta:
cd "C:\Windows\System32\certsrv\mscep"
regsvr32 mscep.dll
  1. Verifica que el valor Version coincida con la salida de mscep.dll -? (si el binario lo soporta) o con la versión del archivo en el Explorador.

Paso 4 – Corregir el perfil del servicio

Comprueba que las claves de registro del usuario de servicio existen:

reg query "HKU\<SID_del_servicio>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

Si falta Desktop o My Documents, recrea las entradas con rutas válidas, por ejemplo:

reg add "HKU\<SID_del_servicio>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "C:\Users\svcAccount\Desktop" /f

Reinicia el servicio NDES (net stop ndessvc && net start ndessvc).

Paso 5 – Desactivar temporalmente EDR o exclusiones de memoria

Si sospechas de interferencia, crea una exclusión para mscep.dll en la consola del EDR o desactiva el agente y verifica el comportamiento. En caso de confirmarse, abre un ticket con el proveedor del EDR para que añada una regla de confianza.

Paso 6 – Aplicar o revertir actualizaciones de Windows

Revisa el historial de actualizaciones con wmic qfe list brief /format:table. Busca paquetes que modifiquen IIS o la capa criptográfica (por ejemplo, KBxxxxxxx). Si el problema comenzó después de una actualización, prueba a desinstalarla:

wusa /uninstall /kb:xxxxxxx /quiet /norestart

Si no hay actualización sospechosa, ejecuta sfc /scannow y DISM /Online /Cleanup-Image /RestoreHealth para asegurar la integridad del sistema.

Paso 7 – Reinstalar el rol NDES

Como último recurso, elimina y vuelve a agregar el rol:

Remove-WindowsFeature ADCS-NDES
Install-WindowsFeature ADCS-NDES -IncludeManagementTools

Durante la reinstalación, verifica que el asistente crea los certificados RA automáticamente y que el pool de aplicaciones está configurado con Load User Profile = True.

Cuándo aplicar esta solución

  • Síntomas: IIS 500 con módulo IsapiModule, error 0x80070057 en eventos, GetExtensionVersion devuelve FALSE en depuración, cualquier operación SCEP falla inmediatamente.
  • Entorno: Windows Server 2019/2022/2025 con rol NDES instalado, independientemente de la versión de la CA subordinada.
  • No aplica: Cuando el error proviene de problemas de red (puertos bloqueados) o de la propia CA que rechaza la solicitud después de que la extensión haya sido invocada.

Código

# Verificar certificados RA en el almacén LocalMachine\My
certutil -store My | findstr /i "CEP Encryption"
certutil -store My | findstr /i "Exchange Enrollment Agent"

# Reasignar CSP a los certificados RA (reemplazar <thumbprint>)
certutil -repairstore my "<thumbprint>"
certutil -setreg ca\csp "Microsoft Strong Cryptographic Provider"

# Reparar registro ISAPI de mscep.dll
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\ISAPI\mscep.dll" /f
cd "C:\Windows\System32\certsrv\mscep"
regsvr32 mscep.dll

# Corregir perfil de servicio (reemplazar <SID>)
reg add "HKU\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "C:\Users\svcAccount\Desktop" /f

Verificación

  1. Abre un navegador y solicita http://localhost/certsrv/mscep/mscep.dll?operation=GetCACaps. Debería devolver una lista de capacidades (por ejemplo, GetCACaps, GetCACert, PKIOperation).
  2. Revisa el visor de eventos: los IDs 2 y 10 deben desaparecer.
  3. Ejecuta Get-EventLog -LogName Application -Source "Network Device Enrollment Service" -Newest 5 para confirmar que no aparecen nuevos errores.
  4. Usa certutil -urlfetch -verify <certfile> para validar que los certificados RA siguen siendo utilizables.

Notas adicionales

  • En entornos con CNG (KSP) por defecto, crea plantillas de certificado marcadas como Legacy CSP antes de emitir los certificados RA; de lo contrario, la incompatibilidad se manifiesta en GetExtensionVersion.
  • Mantén siempre una copia de la clave privada del certificado RA en un almacén seguro; la pérdida de permisos de lectura es una causa frecuente de fallos