Problema

En entornos Windows es frecuente encontrarse con la pantalla del navegador que muestra ERR_SSL_VERSION_OR_CIPHER_MISMATCH al intentar abrir una URL HTTPS que debería devolver JSON, como https://api.nuget.org/v3/index.json. El error no es un simple 404; indica que el cliente y el servidor no lograron negociar un algoritmo de cifrado compatible. El síntoma típico incluye:

  • Navegador o herramienta curl devuelve el mensaje de error mencionado.
  • PowerShell muestra fallos de Schannel en el Visor de eventos.
  • Varios procesos (OneDrive, Visual Studio, etc.) registran “A fatal error occurred while creating a TLS client credential”.

Aunque el caso concreto es NuGet, el patrón se repite con cualquier servicio que requiera TLS 1.2/1.3 y que dependa de la pila de seguridad de Windows (Schannel). El objetivo de este post es ofrecer una guía reutilizable para diagnosticar y corregir este tipo de fallos en cualquier máquina Windows.

Causa

Los errores de versión o cipher suelen originarse en tres áreas principales:

  1. Configuración de protocolos y suites en Schannel

    • Entradas de registro que deshabilitan TLS 1.2/1.3 o eliminan suites modernas (AES‑GCM, ECDHE).
    • Políticas de grupo que sobrescriben la configuración predeterminada.
  2. Componentes de red corruptos

    • Pilas TCP/IP dañadas, caché de sockets o adaptadores virtuales que interfieren con la negociación TLS.
    • Software de seguridad de terceros que intercepta el tráfico y fuerza versiones obsoletas.
  3. Entorno de cuenta o credenciales

    • Cuentas de Azure/Organización añadidas automáticamente bajo “Access work or school” pueden aplicar políticas de seguridad restrictivas (por ejemplo, requerir TLS 1.0).
    • Certificados de cliente expirados o mal instalados que provocan que Schannel falle al crear credenciales.

En la práctica, la combinación más frecuente es una política de registro que elimina la carpeta Protocols bajo HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL. Cuando la carpeta falta, Windows recurre a valores predeterminados que, en algunas versiones, pueden excluir TLS 1.3 o ciertas suites, generando el desajuste con servidores que solo aceptan esas opciones.

Solución

La solución se divide en tres fases: inspección, corrección de la configuración de Schannel y saneamiento de la pila de red. Cada fase incluye pasos que pueden ejecutarse de forma independiente.

1. Verificar la configuración actual de Schannel

# PowerShell (ejecutar como administrador)
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -ErrorAction SilentlyContinue | Select-Object Enabled
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client" -ErrorAction SilentlyContinue | Select-Object Enabled

Si los valores no existen o están a 0, el cliente está deshabilitado para ese protocolo.

2. Restaurar o crear las claves necesarias

# Habilitar TLS 1.2 y TLS 1.3 en el cliente
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client" /v Enabled /t REG_DWORD /d 1 /f

# Asegurarse de que las suites modernas estén habilitadas
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\TLS_AES_256_GCM_SHA384" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" /v Enabled /t REG_DWORD /d 1 /f

Reiniciar el equipo para que los cambios entren en vigor.

3. Resetear la pila de red y sockets

netsh winsock reset
netsh int ip reset

Después de ejecutar los comandos, reinicie nuevamente. Este paso elimina posibles corrupciones en la capa de sockets que a veces provocan que Schannel reciba datos incompletos.

4. Revisar políticas de cuenta y certificados

  • Abra Configuración → Cuentas → Acceso a trabajo o escuela y elimine cualquier cuenta que no sea necesaria para el desarrollo.
  • En certmgr.msc, busque certificados expirados bajo “Personal” y “Trusted Root Certification Authorities”. Elimine los que estén fuera de vigencia.
  • Si la organización impone políticas de TLS mediante GPO, solicite al administrador que revise la plantilla “Computer Configuration → Administrative Templates → Network → SSL Configuration Settings”.

5. Desactivar temporalmente software de inspección SSL

Si tiene un antivirus o proxy que realiza inspección HTTPS, desactívelo momentáneamente y pruebe de nuevo la URL. En muchos casos, la capa de inspección fuerza TLS 1.0, lo que genera el desajuste con servidores que solo aceptan TLS 1.2/1.3.

Cuándo aplicar esta solución

  • Síntomas: error ERR_SSL_VERSION_OR_CIPHER_MISMATCH en navegadores, PowerShell o herramientas de CI que consumen paquetes NuGet, Maven, npm, etc.
  • Entorno: máquinas Windows 10/11, servidores de build, estaciones de desarrollo.
  • Exclusiones: si el servidor remoto está realmente configurado para versiones antiguas (por ejemplo, TLS 1.0) y la política de la empresa exige usar esas versiones, la solución anterior no es adecuada; en ese caso se debe habilitar explícitamente los protocolos antiguos (no recomendado por seguridad).

Código

# Habilitar TLS 1.2 y TLS 1.3 + reset de Winsock
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client" /v Enabled /t REG_DWORD /d 1 /f
netsh winsock reset

Verificación

  1. Prueba de conectividad

    curl -I https://api.nuget.org/v3/index.json
    

    La respuesta debe mostrar HTTP/2 200 sin errores de SSL.

  2. Visor de eventos
    Abra eventvwr.msc, filtre por Schannel y confirme que ya no aparecen eventos con el ID 36874 o mensajes “A fatal error occurred while creating a TLS client credential”.

  3. PowerShell

    [Net.ServicePointManager]::SecurityProtocol
    

    El valor debe incluir Tls12 y Tls13.

  4. IDE o herramienta de build
    Ejecutar una restauración de paquetes NuGet (dotnet restore) y observar que la descarga se completa sin fallos.

Notas adicionales

  • En entornos corporativos, siempre verifique con el equipo de seguridad antes de habilitar TLS 1.3, ya que algunas políticas pueden requerir auditoría.
  • Mantenga Windows actualizado; las actualizaciones de seguridad suelen incluir mejoras en la lista de suites de Schannel.
  • Si necesita forzar una suite específica para pruebas, puede usar la variable de entorno DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0 para que .NET caiga en la implementación clásica de WinHTTP, lo que a veces elude configuraciones corruptas.
  • Documente cualquier cambio de registro en un control de versiones interno; revertir configuraciones es mucho más sencillo cuando se cuenta con historial.