Actualizar el servicio web .NET para usar TLS 1.2

99

Necesito usar TLS 1.2 para conectarme desde mi servicio web .NET a otro que forzará TLS 1.2. Encontré un recurso que decía que .NET 4.6 usa TLS 1.2 de forma predeterminada, por lo que parecía la solución más fácil. Actualicé .NET framework en el servidor y reinicié. En IIS intenté crear un grupo de aplicaciones usando .NET 4.6 pero 4.0 era la única opción. Luego encontré algo que decía que todavía diría 4.0 porque 4.6 es una actualización "en su lugar" para .NET 4.0. Así que pensé que tal vez había terminado. Sin embargo, en una página de error que obtuve por razones no relacionadas, decía Microsoft .NET Framework Version:4.0.30319que parece que no me he actualizado correctamente. ¿Algún consejo sobre cómo asegurarme de que mi grupo de aplicaciones esté usando .NET 4.6 o, de manera más general, cómo habilitar TLS 1.2?

nasch
fuente
4
Creo que TLS12 debe estar habilitado en el servidor. support.quovadisglobal.com/kb/a433/…
lcryder
4
¿Por qué los votos negativos?
nasch

Respuestas:

140

De hecho, acabamos de actualizar un servicio web .NET a 4.6 para permitir TLS 1.2.

Lo que Artem está diciendo fueron los primeros pasos que dimos. Recopilamos el marco del servicio web a 4.6 e intentamos cambiar la clave de registro para habilitar TLS 1.2, aunque esto no funcionó: la conexión todavía estaba en TLS 1.0. Además, no queríamos rechazar SLL 3.0, TLS 1.0 o TLS 1.1 en la máquina: otros servicios web podrían estar usando esto; revertimos nuestros cambios en el registro.

De hecho, cambiamos los archivos Web.Config para decirle a IIS: "hey, ejecúteme en 4.6 por favor".

Estos son los cambios que agregamos en la recompilación web.config + en .NET 4.6:

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->

    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>

Y la conexión cambió a TLS 1.2, porque IIS ahora está ejecutando el servicio web en 4.6 (dicho explícitamente) y 4.6 usa TLS 1.2 de forma predeterminada.

Etienne Faucher
fuente
3
Aquí está la documentación que usamos para la investigación: HTTPRuntime , RenderingCompatibility
Etienne Faucher
1
Lo descubrí: no estaba solicitando HTTPS. Después de arreglar eso, funcionó.
Nasch
3
Cambiar la compilación a 4.6 y agregar httpRuntime 4.6 fue suficiente en nuestro caso, ¡gracias por la solución!
krilovich
2
Esta es totalmente la respuesta correcta. Acabo de pasar por esto recientemente. Aquí hay una publicación de blog al respecto: blog.thelevelup.com/pci-security-is-your-restaurant-ready y un proyecto de GitHub que hace esto: github.com/TheLevelUp/pos-tls-patcher
user24601
88

Agregue el siguiente código antes de crear una instancia de su cliente de servicio web:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

O para compatibilidad con versiones anteriores de TLS 1.1 y anteriores:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
John Wu
fuente
2
Sí, ya lo estoy haciendo, pero el mensaje de error sigue indicando .NET 4.0.
nasch
12
Esa es tu versión CLR. El .Net CLR tiene dos versiones, 2.0 y 4.0. En IIS, especifica la versión de CLR, no la versión de Framework. IIS no le dirá .Net 4.6 porque eso no le importa. Si compiló usando 4.6, entonces está usando 4.6.
Amy
2
TLS 1.2 es compatible desde .NET 4.5 en adelante
Gilberto Alexandre
5
En este caso, | = es superior a solo =. Son banderas binarias, no sobrescribas todo lo demás innecesariamente.
Izzy
2
@JohnWu: tenga en cuenta el comentario de Izzy anterior. Su código le dice a .NET que use explícitamente SOLO TLS 1.2 cuando se conecte a recursos HTTPS. Es decir, si un servidor solo tuviera TLS 1.1, su código evitaría que se conectara, ya que solo usa TLS 1.2. Debe usar | = para decirle a su código "intente usar TLS 1.2 también como una opción" cuando el cliente y el servidor negocien qué protocolo usar.
Don Cheadle
27

si está utilizando .Net antes de 4.5, no tendrá Tls12 en la enumeración, por lo que el estado se menciona explícitamente aquí

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
bresleveloper
fuente
17

Se necesitan tres pasos:

  1. Marque explícitamente SSL2.0, TLS1.0, TLS1.1 como prohibido en su servidor, agregando Enabled=0y DisabledByDefault=1a su registro (la ruta completa es HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Ver pantalla para detalles registro

  2. Habilite explícitamente TLS1.2siguiendo los pasos de 1. Solo use Enabled=1y DisabledByDefault=0respectivamente.

NOTA: verificar la versión del servidor: Windows Server 2003no es compatible con el TLS 1.2protocolo

  1. Habilite TLS1.2solo en el nivel de la aplicación, como @John Wu sugirió anteriormente.

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Espero que esta guía te ayude.

ACTUALIZACIÓN Como mencionó @Subbu: Guía oficial

Artem
fuente
1
Referencia oficial - technet.microsoft.com/en-us/library/…
Subbu
Hola @Artem después de agregar los tls, ¿necesito reiniciar el servidor?
Simba
@Simba probablemente resolvió esto, pero haciendo esto ahora NO necesitaba reiniciar el servidor.
Matt N.
5

Para mí a continuación funcionó:

Paso 1: descargó e instaló el instalador web exe de https://www.microsoft.com/en-us/download/details.aspx?id=48137 en el servidor de aplicaciones. Reinició el servidor de aplicaciones una vez completada la instalación.

Paso 2: agregaron los cambios a continuación en web.config

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />
</system.web>

Paso 3: Después de completar los pasos 1 y 2, dio un error, " WebForms UnobtrusiveValidationMode requiere un ScriptResourceMapping para 'jquery'. Agregue un ScriptResourceMapping llamado jquery (distingue entre mayúsculas y minúsculas) " y para resolver este error, agregué la siguiente clave en la configuración de la aplicación en mi archivo web.config

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
KRM
fuente
Agregar el marco de destino httpRuntime funcionó para mí.
Mark Redman
0

PowerBI Embedded requiere TLS 1.2.

La respuesta anterior de Etienne Faucher es su solución. enlace rápido a la respuesta anterior ... enlace rápido a la respuesta anterior ... ( https://stackoverflow.com/a/45442874 )

PowerBI requiere TLS 1.2 Junio ​​de 2020: esta es su respuesta : considere forzar su tiempo de ejecución de IIS a obtener hasta 4.6 para forzar el comportamiento predeterminado de TLS 1.2 que está buscando en el marco. La respuesta anterior le brinda una solución de solo cambio de configuración.

Síntomas : Conexión TCP / IP cerrada forzada y rechazada a Microsoft PowerBI Embedded que aparece de repente en todos sus sistemas.

Estas llamadas PowerBI simplemente dejan de funcionar con un error de cierre duro de TCP / IP, como si un firewall bloqueara una conexión. Por lo general, los pasos de autenticación funcionan; es cuando ingresa al servicio para un espacio de trabajo específico e informa las identificaciones que falla.

Esta es la nota de 2020 de Microsoft PowerBI sobre TLS 1.2 requerido

PowerBIClient

métodos que muestran este problema

GetReportsInGroupAsync GetReportsInGroupAsAdminAsync GetReportsAsync GetReportsAsAdminAsync Microsoft.PowerBI.Api HttpClientHandler Force TLS 1.1 TLS 1.2

Términos de error de búsqueda para ayudar a las personas a encontrar esto: System.Net.Http.HttpRequestException: se produjo un error al enviar la solicitud System.Net.WebException: la conexión subyacente se cerró: se produjo un error inesperado en un envío. System.IO.IOException: No se pueden leer los datos de la conexión de transporte: el host remoto cerró a la fuerza una conexión existente.

Surfista de sql
fuente