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
curldevuelve el mensaje de error mencionado. - PowerShell muestra fallos de
Schannelen 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:
-
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.
-
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.
-
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
-
Prueba de conectividad
curl -I https://api.nuget.org/v3/index.jsonLa respuesta debe mostrar
HTTP/2 200sin errores de SSL. -
Visor de eventos
Abraeventvwr.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”. -
PowerShell
[Net.ServicePointManager]::SecurityProtocolEl valor debe incluir
Tls12yTls13. -
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=0para 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.