¿Cuál es el protocolo de seguridad predeterminado para comunicarse con servidores que admiten hasta TLS 1.2
? Será .NET
por defecto, seleccione el protocolo de seguridad más alta soportada en el lado del servidor o tengo que añadir explícitamente esta línea de código:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
¿Hay alguna manera de cambiar este valor predeterminado, además de un cambio de código?
Por último, ¿ .NET 4.0
solo admite hasta TLS 1.0
? es decir, tengo que actualizar los proyectos del cliente a 4.5 para admitirlos TLS 1.2
.
Mi motivación es eliminar el soporte SSLv3
del lado del cliente incluso si el servidor lo admite (ya tengo un script de PowerShell para deshabilitar esto en el registro de la máquina) y admitir el protocolo TLS más alto que el servidor admite.
Actualización:
Mirando la ServicePointManager
clase en .NET 4.0
No veo valores enumerados para TLS 1.0
y 1.1
. En ambos .NET 4.0/4.5
, el valor predeterminado es SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Esperemos que este valor predeterminado no se rompa deshabilitando SSLv3
en el registro.
Sin embargo, he decidido que tengo que actualizar todas las aplicaciones .NET 4.5
y agregar explícitamente de SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
todos modos a todos los códigos de arranque de todas las aplicaciones.
Esto hará que las solicitudes salientes a varias API y servicios no se degraden SSLv3
y deben seleccionar el nivel más alto TLS
.
¿Este enfoque suena razonable o excesivo? Tengo muchas aplicaciones para actualizar, y quiero probarlas en el futuro, ya que escuché que TLS 1.0
algunos proveedores pueden dejar de usarlas en el futuro cercano.
Como cliente que realiza solicitudes de salida a las API, ¿la desactivación de SSL3 en el registro tiene algún efecto en el marco .NET? Veo por defecto, TLS 1.1 y 1.2 no están habilitados, ¿tenemos que habilitarlo a través del registro? RE http://support.microsoft.com/kb/245030 .
Después de un poco de investigación, creo que la configuración del registro no tendrá ningún efecto ya que se aplican a IIS (subclave de servidor) y navegadores (subclave de cliente).
Lo sentimos, esta publicación se convirtió en varias preguntas, seguidas de respuestas "quizás".
Respuestas:
Algunos de los que dejan comentarios han notado que la configuración
System.Net.ServicePointManager.SecurityProtocol
valores específicos significa que su aplicación no podrá aprovechar futuras versiones de TLS que pueden convertirse en los valores predeterminados en futuras actualizaciones de .NET. En lugar de especificar una lista fija de protocolos, puede activar o desactivar los protocolos que conoce y le interesan, dejando los demás tal como están.Para activar TLS 1.1 y 1.2 sin afectar otros protocolos:
Observe el uso de
|=
para activar estas banderas sin desactivar otras.Para desactivar SSL3 sin afectar otros protocolos:
fuente
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod se basa en las mismas bibliotecas subyacentes de .NET Framework.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
El valor predeterminado
System.Net.ServicePointManager.SecurityProtocol
en ambos .NET4.0/4.5
esSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
soporta hastaTLS 1.0
mientras.NET 4.5
soporta hastaTLS 1.2
Sin embargo, la orientación de una aplicación
.NET 4.0
aún puede admitir hastaTLS 1.2
si.NET 4.5
está instalada en el mismo entorno..NET 4.5
se instala encima de.NET 4.0
, reemplazandoSystem.dll
.He verificado esto observando el protocolo de seguridad correcto establecido en el tráfico
fiddler4
y configurando manualmente los valores enumerados en un.NET 4.0
proyecto:Referencia:
Si intenta hackear un entorno con SOLO
.NET 4.0
instalado, obtendrá la excepción:Sin embargo, no recomendaría este "truco" ya que un parche futuro, etc., podría romperlo. *
Por lo tanto, he decidido que la mejor ruta para eliminar el soporte
SSLv3
es:.NET 4.5
Agregue lo siguiente al código de reinicio para anular los valores predeterminados y futuros:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Alguien me corrige si este truco está mal, pero las pruebas iniciales veo que funciona
fuente
ServicePointManager.cs
see referencesource.microsoft.com/#System/net/System/Net/….NET 4.5
valores predeterminados de Tls12, pero como ha dicho aquí, no lo hace. Te da la opción de usarloSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
según support.microsoft.com/en-us/help/3069494/…Puede anular el comportamiento predeterminado en el siguiente registro:
y
Para más detalles, consulte la implementación de
ServicePointManager
.fuente
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(y / o/reg:32
)Cree un archivo de texto con una
.reg
extensión y los siguientes contenidos:O descárguelo de la siguiente fuente:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Haga doble clic para instalar ...
fuente
He descubierto que cuando especifico solo TLS 1.2 que todavía se negociará a 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
He especificado esto en el método de inicio Global.asax para mi aplicación web .net 4.5.
fuente
El siguiente código:
Constantes:
Otros protocolos no se verán afectados. Esto lo hace compatible con protocolos futuros (Tls1.3, etc.).
Código
Salida
fuente
Tuve el problema cuando mi cliente actualizó TLS de 1.0 a 1.2. Mi aplicación usa .net framework 3.5 y se ejecuta en el servidor. Así que lo arreglé de esta manera:
Antes de llamar a HttpWebRequest.GetResponse () agregue este comando:
Extensiones 2 DLL agregando 2 nuevas clases: System.Net y System.Security.Authentication
Descargar lote:
Para el lote de descarga y más detalles, puede ver aquí:
https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-and-server-2008-r2-sp1
fuente
El mecanismo de cambio de registro funcionó para mí después de una lucha. En realidad, mi aplicación se ejecutaba como 32 bits. Entonces tuve que cambiar el valor bajo la ruta.
El tipo de valor debe ser DWORD y un valor superior a 0. Mejor uso 1.
fuente
Estoy ejecutando bajo .NET 4.5.2, y no estaba contento con ninguna de estas respuestas. Como estoy hablando con un sistema que admite TLS 1.2, y dado que SSL3, TLS 1.0 y TLS 1.1 están rotos e inseguros para su uso, no quiero habilitar estos protocolos. Bajo .NET 4.5.2, los protocolos SSL3 y TLS 1.0 están habilitados por defecto, lo que puedo ver en el código al inspeccionar
ServicePointManager.SecurityProtocol
. Bajo .NET 4.7, está el nuevoSystemDefault
modo de protocolo que entrega explícitamente la selección del protocolo al sistema operativo, donde creo que sería apropiado confiar en el registro u otras configuraciones del sistema. Sin embargo, eso no parece ser compatible con .NET 4.5.2. En aras de escribir código compatible con reenvío, eso seguirá tomando las decisiones correctas incluso cuando TLS 1.2 se rompa inevitablemente en el futuro, o cuando actualice a .NET 4.7+ y entregue más responsabilidad para seleccionar un protocolo apropiado para el sistema operativo , Adopté el siguiente código:Este código detectará cuando se habilite un protocolo inseguro conocido y, en este caso, eliminaremos estos protocolos inseguros. Si no quedan otros protocolos explícitos, forzaremos la habilitación de TLS 1.2, como el único protocolo seguro conocido compatible con .NET en este momento. Este código es compatible con versiones posteriores, ya que tendrá en cuenta los nuevos tipos de protocolos que no conoce sobre su incorporación en el futuro, y también jugará bien con el nuevo
SystemDefault
estado en .NET 4.7, lo que significa que no tendré que volver a visitar este código en el futuro. Recomiendo encarecidamente adoptar un enfoque como este, en lugar de codificar de manera incondicional cualquier estado de protocolo de seguridad en particular, de lo contrario, tendrá que volver a compilar y reemplazar su cliente con una nueva versión para actualizar a un nuevo protocolo de seguridad cuando TLS 1.2 está inevitablemente roto, o es más probable que tenga que dejar los protocolos inseguros existentes activados durante años en su servidor, haciendo de su organización un objetivo para los ataques.fuente
SecurityProtocolType.SystemDefault
indicador se evalúa0
, por lo que verificarif (securityProtocols == 0)
con el indicador de inclusión bit a bit o TLS 1.2 siempre incluirá TLS 1.2, incluso después de que se "rompa", ¿verdad? No hay disparos bruscos aquí. Realmente estoy tratando de encontrar el mejor camino a seguir.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(sin bloqueo) no mantiene SystemDefault, el securityProtocols solo tiene TLS2 después. Entonces, ¿quiere decir que cuando el valor es SystemDefault, no se debe actualizar ningún valor? Con respecto a la compatibilidad directa, ¿está asumiendo que el sistema operativo se encargaría de habilitar un protocolo más nuevo como TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
SecurityProtocolType` enum tiene un[Flags]
atributo, y el valor de enumeración SystemDefault es0
, el valor SystemDefault se eliminará, incluso si se estableció previamente. El resultado final es que puede establecerloSevicePointManager.SecurityProtocol
en 0 o en cualquier combinación de los otros valores de enumeración. Si lo configura en SystemDefault, básicamente está optando por no especificar el protocolo usted mismo y dejar que el SO decida.Microsoft publicó recientemente las mejores prácticas en torno a esto. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Resumen
Diríjase a .Net Framework 4.7, elimine cualquier código que configure SecurityProtocol, por lo que el sistema operativo se asegurará de que use la solución más segura.
NB: También deberá asegurarse de que la última versión de TLS sea compatible y esté habilitada en su sistema operativo.
Para obtener más información y marcos anteriores, consulte el enlace de MS.
fuente
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Para completar, aquí hay un script de Powershell que establece las claves de registro mencionadas anteriormente:
fuente
Una alternativa a la codificación rígida
ServicePointManager.SecurityProtocol
o la clave SchUseStrongCrypto explícita como se mencionó anteriormente:puede indicarle a .NET que use la configuración predeterminada de SCHANNEL con la clave SystemDefaultTlsVersions,
por ejemplo:
fuente
La MEJOR solución a este problema parece ser actualizar al menos a .NET 4.6 o posterior, que elegirá automáticamente protocolos fuertes y cifrados fuertes.
Si no puede actualizar a .NET 4.6, el consejo de configuración
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Y usando la configuración del registro:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD de 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD of DWORD of 1WORD of DWORD of DWORD of DWORD of 1
Resultados en el uso de algo diferente a TLS 1.0 y un cifrado fuerte.
En mis pruebas, solo la configuración en el Wow6432Node hizo alguna diferencia, a pesar de que mi aplicación de prueba se creó para Any CPU.
fuente
De acuerdo con las mejores prácticas de Seguridad de la capa de transporte (TLS) con .NET Framework : para garantizar que las aplicaciones de .NET Framework permanezcan seguras, la versión de TLS no debe estar codificada. En su lugar, configure las claves de registro:
SystemDefaultTlsVersions
ySchUseStrongCrypto
:fuente
Si puede usar .NET 4.7.1 o posterior, usará TLS 1.2 como el protocolo mínimo basado en las capacidades del sistema operativo. Por recomendación de Microsoft:
fuente
Para la clave: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Valor: SchUseStrongCrypto
Debe establecer el valor en 1.
fuente