Atualize o serviço da web .NET para usar TLS 1.2

100

Preciso usar o TLS 1.2 para me conectar do meu serviço da web .NET a outro que forçará o TLS 1.2. Eu encontrei um recurso que dizia que o .NET 4.6 usa TLS 1.2 por padrão, então parecia a solução mais fácil. Atualizei o .NET framework no servidor e reiniciei. No IIS tentei fazer um pool de aplicativos usando .NET 4.6, mas 4.0 era a única opção. Então eu encontrei algo que dizia que ainda diria 4.0 porque 4.6 é uma atualização "no local" para .NET 4.0. Então pensei que talvez tivesse acabado. No entanto, em uma página de erro que recebi por motivos não relacionados, Microsoft .NET Framework Version:4.0.30319parece que não atualizei com êxito. Alguma sugestão sobre como ter certeza de que meu pool de aplicativos está usando .NET 4.6 ou, de forma mais geral, como habilitar o TLS 1.2?

nasch
fonte
4
Acredito que o TLS12 deve ser habilitado no servidor. support.quovadisglobal.com/kb/a433/…
lcryder
4
Por que os votos negativos?
nasch

Respostas:

144

Na verdade, acabamos de atualizar um serviço da web .NET para 4.6 para permitir o TLS 1.2.

O que Artem está dizendo foram os primeiros passos que demos. Nós recompilamos a estrutura do serviço web para 4.6 e tentamos mudar a chave de registro para habilitar o TLS 1.2, embora isso não funcionasse: a conexão ainda estava em TLS 1.0. Além disso, não queríamos proibir o SLL 3.0, TLS 1.0 ou TLS 1.1 na máquina: outros serviços da web poderiam estar usando isso; revertemos nossas alterações no registro.

Na verdade, alteramos os arquivos Web.Config para informar ao IIS: "ei, execute-me no 4.6, por favor".

Aqui estão as alterações que adicionamos no web.config + recompilação no .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>

E a conexão mudou para TLS 1.2, porque o IIS agora está executando o serviço da web em 4.6 (explicado explicitamente) e 4.6 está usando TLS 1.2 por padrão.

Etienne Faucher
fonte
3
Aqui está a documentação que usamos para pesquisa: HTTPRuntime , RenderingCompatibility
Etienne Faucher
1
Eu descobri - eu não estava solicitando HTTPS. Depois de consertar isso, funcionou.
nasch
3
Mudar a compilação para 4.6 e adicionar o httpRuntime 4.6 foi o suficiente no nosso caso, obrigado pela solução!
Krilovich
2
Esta é a resposta totalmente certa. Acabei de passar por isso recentemente. Aqui está uma postagem no blog sobre isso: blog.thelevelup.com/pci-security-is-your-restaurant-ready e um projeto GitHub que faz isso: github.com/TheLevelUp/pos-tls-patcher
user24601
90

Adicione o seguinte código antes de instanciar seu cliente de serviço da web:

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

Ou para compatibilidade com versões anteriores com TLS 1.1 e anterior:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
John Wu
fonte
2
Sim, já estou fazendo isso, mas a mensagem de erro ainda indica .NET 4.0.
nasch
13
Essa é a sua versão CLR. O .Net CLR tem duas versões, 2.0 e 4.0. No IIS, você especifica a versão do CLR, não a versão do Framework. O IIS não dirá a você .Net 4.6 porque não se preocupa com isso. Se você compilou usando 4.6, então você está usando 4.6.
Amy
3
TLS 1.2 é compatível com .NET 4.5 em diante
Gilberto Alexandre
6
Nesse caso, | = é superior a apenas =. Eles são sinalizadores binários, não sobrescreva todo o resto desnecessariamente.
Izzy
2
@JohnWu - observe o comentário de Izzy acima. Seu código informa ao .NET para usar explicitamente SOMENTE o TLS 1.2 ao se conectar a recursos HTTPS. Ou seja, se um servidor tivesse apenas TLS 1.1, seu código o impediria de se conectar, pois está usando apenas TLS 1.2. Você deve usar | = para informar ao seu código "tente usar TLS 1.2 também como uma opção" quando o cliente e o servidor negociarem qual protocolo usar.
Don Cheadle
29

se você estiver usando .Net anterior a 4.5, não terá Tls12 no enum, então o estado é explicitamente mencionado aqui

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Bresleveloper
fonte
Obrigado. Isso me ajudou. Para quem está pesquisando, eu estava tentando criar uma nova pasta em AzureFileStorage: fileDirectory.CreateIfNotExists (); O fileDirectory é um objeto CloudFileDirectory. Simplesmente coloquei ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072; antes disso e funcionou como um encanto. Obrigado novamente.
SuperVillainPresident
17

Três etapas necessárias:

  1. Marque explicitamente SSL2.0, TLS1.0, TLS1.1 como proibido na máquina do servidor, adicionando Enabled=0e DisabledByDefault=1ao seu registro (o caminho completo é HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Veja a tela para detalhes registro

  2. Ative explicitamente TLS1.2seguindo as etapas de 1. Basta usar Enabled=1e DisabledByDefault=0respectivamente.

NOTA: verifique a versão do servidor: Windows Server 2003não suporta o TLS 1.2protocolo

  1. Habilite TLS1.2apenas no nível do aplicativo, como @John Wu sugerido acima.

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

Espero que este guia ajude.

ATUALIZAÇÃO Como @Subbu mencionou: Guia oficial

Artem
fonte
1
Referência oficial - technet.microsoft.com/en-us/library/…
Subbu
Olá @Artem, depois de adicionar os tls, preciso reiniciar o servidor?
Simba
@Simba provavelmente você resolveu isso, mas fazendo isso agora, NÃO precisei reiniciar o servidor.
Matt N.
5

Para mim abaixo funcionou:

Etapa 1: baixou e instalou o exe do instalador da web de https://www.microsoft.com/en-us/download/details.aspx?id=48137 no servidor de aplicativos. Reinicializou o servidor de aplicativos após a conclusão da instalação.

Etapa 2: adicionadas as alterações abaixo no web.config

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

Etapa 3: após concluir as etapas 1 e 2, ocorreu um erro, " WebForms UnobtrusiveValidationMode requer um ScriptResourceMapping para 'jquery'. Adicione um ScriptResourceMapping denominado jquery (diferencia maiúsculas de minúsculas) " e para resolver esse erro, adicionei a chave abaixo em appsettings no meu arquivo web.config

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
KRM
fonte
Adicionar a estrutura de destino httpRuntime funcionou para mim.
Mark Redman
0

O PowerBI Embedded requer TLS 1.2.

A resposta acima de Etienne Faucher é a sua solução. link rápido para a resposta acima ... link rápido para a resposta acima ... ( https://stackoverflow.com/a/45442874 )

O PowerBI requer TLS 1.2 de junho de 2020 - Esta é a sua resposta - Considere forçar o tempo de execução do IIS a chegar a 4,6 para forçar o comportamento padrão do TLS 1.2 que você está procurando na estrutura. A resposta acima fornece uma solução apenas para alteração de configuração.

Sintomas : Conexão TCP / IP forçada e rejeitada com o Microsoft PowerBI Embedded que aparece de repente em seus sistemas.

Essas chamadas do PowerBI simplesmente param de funcionar com um erro Hard TCP / IP Close, como se um firewall bloquearia uma conexão. Normalmente as etapas de autenticação funcionam - é quando você acessa o serviço para um espaço de trabalho específico e ids de relatório que ele falha.

Esta é a nota de 2020 do Microsoft PowerBI sobre o TLS 1.2 necessário

PowerBIClient

métodos que mostram este problema

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

Pesquise os termos de erro para ajudar as pessoas a encontrar isso: System.Net.Http.HttpRequestException: Ocorreu um erro ao enviar a solicitação System.Net.WebException: A conexão subjacente foi fechada: Ocorreu um erro inesperado em um envio. System.IO.IOException: Incapaz de ler dados da conexão de transporte: Uma conexão existente foi fechada à força pelo host remoto.

Sql Surfer
fonte