.Net Framework 4.6.1 no está predeterminado a TLS 1.2
ssl tls1.2 (6)
MSDN: propiedad de ServicePointManager.SecurityProtocol
Esta propiedad selecciona la versión del protocolo Secure Sockets Layer (SSL) o Transport Layer Security (TLS) para usar en las nuevas conexiones que usan solo el esquema del Protocolo seguro de transferencia de hipertexto (HTTPS); Las conexiones existentes no se cambian. Tenga en cuenta que no se enumera ningún valor predeterminado para esta propiedad, a propósito.
El panorama de seguridad cambia constantemente, y los protocolos y niveles de protección predeterminados cambian a lo largo del tiempo para evitar debilidades conocidas. Los valores predeterminados variarán según la configuración individual de la máquina, el software instalado y los parches que se hayan aplicado.
Tomado de here
Nuestro cliente ha actualizado recientemente el protocolo de seguridad a TLS 1.2. Por lo tanto, nuestra aplicación se ha actualizado a 4.6.1 esperando que el protocolo de seguridad sea predeterminado para TLS 1.2, pero no lo es. ¿Alguna idea de por qué?
Como han mencionado otros, hay una serie de claves de registro de Windows que deben configurarse para habilitar TLS 1.2 en las aplicaciones .NET existentes sin establecer explícitamente la versión del protocolo en el código de la aplicación.
Para hacer que el código .NET 4.x seleccione el protocolo más fuerte disponible de forma predeterminada (es decir, cuando un protocolo no se especifica explícitamente en el código), se necesitan las siguientes claves de registro:
En versiones de Windows de 32 y 64 bits : HKLM/SOFTWARE/Microsoft/.NETFramework/4.0.30319/SchUseStrongCrypto: 0X00000001
En versiones de Windows de 64 bits : HKLM/SOFTWARE/WOW6432Node/Microsoft/.NETFramework/4.0.30319/SchUseStrongCrypto: 0X00000001
El valor de WOW6432Node es necesario para habilitar TLS 1.2 en aplicaciones de 32 bits cuando se ejecuta en sistemas de 64 bits.
Pero aquí está la solución rápida y fácil: https://github.com/TheLevelUp/pos-tls-patcher
Actualizar:
Si se dirige a .NET 4.6 o 4.7, estará interesado en las mejores prácticas de Seguridad de la capa de transporte (TLS) con .NET Framework .
Tenga en cuenta que el https://github.com/TheLevelUp/pos-tls-patcher vinculado anteriormente sigue muy de cerca la recomendación de Microsoft para las aplicaciones existentes .NET 4.0 y 4.5 que no pueden apuntar a .NET 4.6 o superior.
La razón por la que el protocolo de seguridad no se estableció de forma predeterminada en TLS 1.2 es porque no hay un valor predeterminado para esto en .NET Framework 4.6.1. Lo siento si esto reitera lo que ya se ha dicho, pero quería elaborar y no tengo suficiente reputación para comentar.
Tampoco hay un valor predeterminado en 4.6.2, sin embargo, como uno de los comentaristas mencionados anteriormente, una aplicación de consola parece tener un valor predeterminado de TLS 1.2. Intenté exactamente el mismo código en un proyecto de sitio web orientado a 4.6.2 y NO se estableció de forma predeterminada en TLS 1.2.
4.7 y superior tiene un valor predeterminado de SecurityProtocolType.SystemDefault.
"Esto permite que las API de redes de .NET Framework basadas en SslStream (como FTP, HTTP y SMTP) hereden los protocolos de seguridad predeterminados del sistema operativo o de cualquier configuración personalizada realizada por un administrador del sistema"
Tuve un problema similar y esto es lo que funcionó para mí.
abra Powershell y verifique los protocolos compatibles usando
[Net.ServicePointManager]::SecurityProtocol
Ejecute los siguientes 2 cmdlets para establecer las claves de registro de criptografía fuerte de .NET Framework :
establezca una fuerte criptografía en .NET Framework de 64 bits (versión 4 y superior)
Set-ItemProperty -Path ''HKLM:/SOFTWARE/Wow6432Node/Microsoft/.NetFramework/v4.0.30319'' -Name ''SchUseStrongCrypto'' -Value ''1'' -Type DWord
establezca una fuerte criptografía en .NET Framework de 32 bits (versión 4 y superior)
Set-ItemProperty -Path ''HKLM:/SOFTWARE/Microsoft/.NetFramework/v4.0.30319'' -Name ''SchUseStrongCrypto'' -Value ''1'' -Type DWord
Reinicie Powershell y verifique nuevamente el protocolo compatible usando
[Net.ServicePointManager]::SecurityProtocol
Ahora debería mostrar Tls12
también.
Espero que esto ayude
Utilicé esto en mi código en la página inicial. La aplicación es formularios web en VB.NET con .NET Framework 4.6.1
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
Yo también enfrenté el problema. Cuando la aplicación local intentó conectarse a un servidor que admite TLS 1.1 y TLS 1.2, se usó para obtener la excepción "Una conexión existente fue cerrada por la fuerza del host remoto" o cuando TLS 1.1 / 1.2 no se habilitó correctamente, se usó para obtener "Win32Exception: El cliente y el servidor no pueden comunicarse, porque no poseen un algoritmo común "
A continuación se muestran todas las claves de registro y los valores necesarios para el sistema operativo Windows x64. Si tiene un sistema operativo de 32 bits (x86) simplemente elimine las últimas 2 líneas. TLS 1.0 será deshabilitado por el script de registro. Se requiere reiniciar el sistema operativo.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/SSL 2.0]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/SSL 2.0/Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/SSL 2.0/server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/ssl 3.0]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/ssl 3.0/client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/ssl 3.0/server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.0]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.0/client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.0/server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.1]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.1/client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.1/server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.2]
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.2/client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/tls 1.2/server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework/v4.0.30319]
"SchUseStrongCrypto"=dword:00000001