Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Nota
Esta página contém informações TLS do .NET Framework. Se você estiver procurando informações sobre TLS do .NET, consulte: Práticas recomendadas de TLS/SSL
O .NET Framework suporta o uso do protocolo TLS (Transport Layer Security) para proteger as comunicações de rede.
O que é Transport Layer Security (TLS)?
Aviso
TLS 1.0 e 1.1 foi preterido por RFC8996. Este documento abrange apenas TLS 1.2 e TLS 1.3.
O protocolo Transport Layer Security (TLS) é uma versão mais recente do padrão projetada para ajudar a proteger a privacidade das informações comunicadas pela Internet. O TLS 1.3 é um padrão que fornece melhorias de segurança em relação às versões anteriores. Este artigo apresenta recomendações para proteger aplicativos .NET Framework que usam o protocolo TLS.
Quem pode beneficiar deste documento?
- Usando diretamente as System.Net APIs (por exemplo, System.Net.Http.HttpClient e System.Net.Security.SslStream).
- Usando diretamente clientes e serviços WCF usando o System.ServiceModel namespace.
Suporte a TLS no .NET Framework
Como o .NET Framework depende do Schannel Windows, quais versões podem ser negociadas e qual versão será usada depende do sistema operacional.
Aqui está uma tabela de exemplo atualizada mostrando a versão TLS mais alta suportada para diferentes combinações de versões do sistema operacional e versões de destino do .NET Framework:
| Versão de destino do .NET Framework | Windows 10 | Windows 11 |
|---|---|---|
| 3.5 | TLS 1,2 | TLS 1,2 |
| 4.6.2 | TLS 1,2 | TLS 1,3 |
| 4.7 | TLS 1,2 | TLS 1,3 |
| 4.7.1 | TLS 1,2 | TLS 1,3 |
| 4.7.2 | TLS 1,2 | TLS 1,3 |
| 4.8 | TLS 1,2 | TLS 1,3 |
| 4.8.1 | TLS 1,2 | TLS 1,3 |
Para obter mais informações, consulte Suporte à versão do protocolo TLS no Schannel.
Recomendações
- Para o TLS 1.3, utilize o .NET Framework 4.8 ou posterior. Veja a seção Auditar o seu código como verificar o seu
target framework. - Não especifique a versão do TLS explicitamente, ou seja, não use as sobrecargas de método
SslStreamque têm um parâmetro explícitoSslProtocols.- Dessa forma, seu código permitirá que o sistema operacional decida sobre a versão TLS.
- Se tiver de definir ServicePointManager.SecurityProtocol, defina-o como SecurityProtocolType.SystemDefault. Isso também usará o padrão do sistema operacional.
- Se for necessário usar as sobrecargas do método
SslStreamque aceitam um parâmetro explícitoSslProtocols, deve passarSslProtocols.SystemDefaultcomo argumento. Isso também usará o padrão do sistema operacional.
- Execute uma auditoria de código completa para verificar se você não está especificando uma versão TLS ou SSL explicitamente.
Aviso
Não use SslProtocols.Default, porque ele define a versão TLS para SSL3 e TLS 1.0 que estão obsoletos.
Quando seu aplicativo permite que o sistema operacional escolha a versão TLS:
- Ele aproveita automaticamente os novos protocolos TLS adicionados no futuro.
- O sistema operativo bloqueia protocolos que se descobrem não serem seguros (por exemplo, SSL3 e TLS 1.0).
Este artigo explica como habilitar a segurança mais forte disponível para a versão do .NET Framework que seu aplicativo destina e executa. Quando um aplicativo define explicitamente um protocolo e uma versão de segurança, ele exclui qualquer outra alternativa e exclui o comportamento padrão do .NET Framework e do sistema operacional. Se você quiser que seu aplicativo seja capaz de negociar uma conexão TLS 1.3, definir explicitamente para uma versão TLS inferior impede uma conexão TLS 1.3.
Se você não puder evitar especificar uma versão do protocolo explicitamente, é altamente recomendável especificar TLS 1.2 ou TLS 1.3 (que é currently considered secure). Para obter orientação sobre como identificar e remover dependências do TLS 1.0, baixe o white paper Resolvendo o problema do TLS 1.0.
WCF suporta TLS 1.2 como o padrão no .NET Framework 4.7. A partir do .NET Framework 4.7.1, o WCF assume como padrão a versão configurada do sistema operacional. Se uma aplicação estiver explicitamente configurada com SslProtocols.None, o WCF usará a configuração padrão do sistema operativo ao utilizar o transporte NetTcp.
Você pode fazer perguntas sobre este documento no problema do GitHub Transport Layer Security (TLS) melhores práticas com o .NET Framework.
Audite seu código e faça alterações no código
Para ASP.NET aplicativos, inspecione o <system.web><httpRuntime targetFramework> elemento de web.config para verificar se você está usando a versão pretendida de destino do .NET Framework.
Para Windows Forms e outros aplicativos, consulte Como direcionar uma versão do .NET Framework.
Use as seções a seguir para verificar se você não está usando uma versão específica de TLS ou SSL.
Definir explicitamente um protocolo de segurança
Se você precisar definir explicitamente um protocolo de segurança em vez de permitir que o .NET ou o sistema operacional escolham o protocolo de segurança, escolha estes protocolos:
- Para .NET Framework 3.5: TLS 1.2
- Para .NET Framework 4.6.2 ou posterior: TLS 1.3
Se você não conseguir encontrar protocolos especificados no enum, poderá adicioná-los como um arquivo de extensão. Veja abaixo.
SslProtocolExtensions.cs
namespace System.Security.Authentication
{
public static class SslProtocolsExtensions
{
// For .NET Framework 3.5
public const SslProtocols Tls12 = (SslProtocols)3072;
// For .NET Framework 4.6.2 and later
public const SslProtocols Tls13 = (SslProtocols)12288;
}
}
SecurityProtocolExtensions.cs
using System.Security.Authentication;
namespace System.Net
{
public static class SecurityProtocolTypeExtensions
{
// For .NET Framework 3.5
public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
// For .NET Framework 4.6.2 and later
public const SecurityProtocolType Tls13 = (SecurityProtocolType)SslProtocolsExtensions.Tls13;
}
}
Para obter mais informações, consulte Suporte para versões padrão do sistema TLS incluídas no .NET Framework 3.5 no Windows 8.1 e Windows Server 2012 R2.
Para APIs System.Net (HttpClient, SslStream)
As secções seguintes mostram como configurar a sua aplicação para usar "versões atualmente consideradas seguras" do TLS (nomeadamente TLS 1.2 e TLS 1.3) se for direcionada para o .NET Framework 4.7 ou posterior.
Para HttpClient e HttpWebRequest
ServicePointManager utiliza o protocolo de segurança padrão configurado no sistema operativo. Para obter a opção de sistema operacional padrão, se possível, não defina um valor para a ServicePointManager.SecurityProtocol propriedade, cujo padrão é .SecurityProtocolType.SystemDefault
Como a SecurityProtocolType.SystemDefault definição faz com que ServicePointManager ele use o protocolo de segurança padrão configurado pelo sistema operativo, a sua aplicação pode correr de forma diferente consoante o sistema operativo onde está a correr. Por exemplo, o Windows 10 usa TLS 1.2, enquanto o Windows 11 usa TLS 1.3.
Para SslStream
SslStream utiliza por defeito o protocolo de segurança e a versão escolhidos pelo sistema operativo. Para obter a melhor escolha do sistema operacional padrão, se possível, não use as sobrecargas do método SslStream que recebem um parâmetro explícito SslProtocols. Caso contrário, passe SslProtocols.None. Recomendamos que você não use Default; a configuração SslProtocols.Default força o uso de SSL 3.0 /TLS 1.0 e impede TLS 1.2.
Não defina um valor para a SecurityProtocol propriedade (para rede HTTP).
Não utilize as sobrecargas de método SslStream que aceitam um parâmetro explícito SslProtocols (para rede de sockets TCP). Ao redirecionar seu aplicativo para o .NET Framework 4.7 ou versões posteriores, você estará seguindo a recomendação de práticas recomendadas.
Para aplicações WCF
As secções seguintes mostram como configurar a sua aplicação para usar "versões atualmente consideradas seguras" do TLS (nomeadamente, TLS 1.2 e TLS 1.3).
Utilização do transporte TCP com segurança de transporte e credenciais de certificado
WCF usa a mesma pilha de rede como o resto do .NET Framework.
Se você estiver visando a versão 4.7.1, o WCF será configurado para permitir que o sistema operacional escolha o melhor protocolo de segurança por padrão, a menos que explicitamente configurado:
- No arquivo de configuração do aplicativo.
- Ou no código-fonte da sua aplicação.
Por padrão, o .NET Framework 4.7 e versões posteriores são configurados para usar TLS 1.2 e permitir conexões usando TLS 1.1 ou TLS 1.0. Configure o WCF para permitir que o sistema operativo escolha o melhor protocolo de segurança, configurando a sua vinculação para usar SslProtocols.None. Podes definir isto em SslProtocols.
SslProtocols.None pode ser acessado em Transport.
NetTcpSecurity.Transport pode ser acessado em Security.
Se você estiver usando uma associação personalizada:
- Configure o WCF para permitir que o sistema operativo escolha o melhor protocolo de segurança, definindo SslProtocols para usar SslProtocols.None.
-
Ou configure o protocolo usado com o caminho de configuração
system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.
Se não estiver a usar uma ligação personalizada e estiver a definir a sua ligação WCF através da configuração, defina o protocolo utilizado com o caminho de configuração .
Usando a Segurança de Mensagens com credenciais de certificado
O .NET Framework 4.7 e versões posteriores por padrão usam o protocolo especificado na SecurityProtocol propriedade. Quando o AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols é definido como true, o WCF escolhe o melhor protocolo, até TLS 1.0.
Configure a segurança através de comutadores AppContext
Os comutadores AppContext descritos nesta secção são relevantes se a sua aplicação tiver como alvo, ou corra em, .NET Framework 4.6.2 ou uma versão posterior. Seja por padrão ou ao defini-los explicitamente, os switches devem, se possível, ser false. Se quiser configurar a segurança através de um ou ambos os comutadores, não especifique um valor de protocolo de segurança no seu código; fazê-lo sobrepõe-se aos comutadores.
Os switches têm o mesmo efeito se você estiver fazendo rede HTTP (ServicePointManager) ou rede de soquetes TCP (SslStream).
Switch.System.Net.DontEnableSchUseStrongCrypto
Um valor de false for Switch.System.Net.DontEnableSchUseStrongCrypto faz com que seu aplicativo use criptografia forte. Um valor de false para DontEnableSchUseStrongCrypto utiliza protocolos de rede mais seguros (TLS 1.2 e TLS 1.1) e bloqueia protocolos que não são seguros. Para obter mais informações, consulte a flag SCH_USE_STRONG_CRYPTO. Um valor de true desativa a criptografia forte para seu aplicativo. Essa opção afeta apenas as conexões de cliente (de saída) em seu aplicativo.
Se o seu aplicativo tiver como destino o .NET Framework 4.6.2 ou versões posteriores, essa opção terá como padrão .false Esse é um padrão seguro, que recomendamos. Se o seu aplicativo for executado no .NET Framework 4.6.2, mas tiver como destino uma versão anterior, a opção padrão assumirá o valor true. Nesse caso, você deve defini-lo explicitamente como false.
DontEnableSchUseStrongCrypto só deve ter um valor de true se você precisar se conectar a serviços herdados que não suportam criptografia forte e não podem ser atualizados.
Switch.System.Net.DontEnableSystemDefaultTlsVersions
Um valor de false for Switch.System.Net.DontEnableSystemDefaultTlsVersions faz com que seu aplicativo permita que o sistema operacional escolha o protocolo. Um valor de true faz com que seu aplicativo use protocolos escolhidos pelo .NET Framework.
Se o seu aplicativo tiver como destino o .NET Framework 4.7 ou versões posteriores, essa opção será padronizada para false. Esse é um padrão seguro que recomendamos. Se o seu aplicativo for executado no .NET Framework 4.7 ou versões posteriores, mas tiver como destino uma versão anterior, a opção assumirá como true, padrão. Nesse caso, você deve defini-lo explicitamente como false.
Configurar protocolos Schannel no Registro do Windows
Pode usar o registo para controlar de forma detalhada os protocolos que a sua aplicação cliente ou de servidor negocia. A rede do seu aplicativo passa pelo Schannel (que é outro nome para Secure Channel). Ao configurar Schannel, pode configurar o comportamento da sua aplicação.
Comece com a chave do HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols Registo. Sob essa chave, você pode criar quaisquer subchaves no conjunto TLS 1.2, TLS 1.3. Em cada uma dessas subchaves, você pode criar subchaves Client e/ou Server. Em Client e Server, você pode criar valores DisabledByDefault DWORD (0 ou 1) e Enabled (0 ou 1).
Para obter mais informações, consulte: Configurações do Registro TLS - Schannel
O indicador SCH_USE_STRONG_CRYPTO
Quando está ativado (por predefinição, ou por um AppContext interruptor), o .NET Framework usa o SCH_USE_STRONG_CRYPTO indicador quando a sua aplicação inicia uma ligação TLS a um servidor. O .NET Framework passa o sinalizador para Schannel instruí-lo a desabilitar algoritmos criptográficos fracos conhecidos, pacotes de codificação e versões do protocolo TLS/SSL que podem ser habilitados de outra forma para melhor interoperabilidade. Para obter mais informações, consulte:
O SCH_USE_STRONG_CRYPTO sinalizador também é passado para Schannel conexões de cliente (de saída) quando explicitamente utiliza os valores enumerados Tls11 ou Tls12 de SecurityProtocolType ou SslProtocols. O SCH_USE_STRONG_CRYPTO sinalizador é usado apenas para conexões em que seu aplicativo atua na função do cliente. Você pode desabilitar protocolos e algoritmos fracos quando seus aplicativos atuam como servidor, definindo as configurações de Registro em nível de máquina Schannel.