Qual é o protocolo de segurança padrão para comunicação com servidores que suportam até TLS 1.2
? Vai .NET
por padrão, escolha a maior protocolo de segurança suportado no lado do servidor ou eu tenho que adicionar explicitamente esta linha de código:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Existe uma maneira de alterar esse padrão, além de uma alteração de código?
Por fim, suporta .NET 4.0
apenas até TLS 1.0
? ou seja, eu tenho que atualizar os projetos do cliente para 4.5 para dar suporte TLS 1.2
.
Minha motivação é remover o suporte SSLv3
no lado do cliente, mesmo que o servidor o suporte (eu já tenho um script do PowerShell para desativá-lo no registro da máquina) e oferecer suporte ao protocolo TLS mais alto suportado pelo servidor.
Atualização:
Olhando para a ServicePointManager
classe, .NET 4.0
não vejo valores enumerados para TLS 1.0
e 1.1
. Nos dois .NET 4.0/4.5
, o padrão é SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Esperamos que esse padrão não seja quebrado ao desativar SSLv3
o registro.
No entanto, decidi que tenho de atualizar todos os aplicativos .NET 4.5
e adicioná- SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
los explicitamente de qualquer maneira a todos os códigos de inicialização de todos os aplicativos.
Isso fará solicitações de saída para várias APIs e serviços para não fazer o downgrade SSLv3
e deve selecionar o nível mais alto de TLS
.
Essa abordagem parece razoável ou exagerada? Eu tenho muitos aplicativos para atualizar e quero protegê-los no futuro, pois ouvi dizer que TLS 1.0
talvez sejam preteridos no futuro próximo por alguns fornecedores.
Como cliente que faz solicitações de saída para APIs, a desativação do SSL3 no registro tem efeito na estrutura .NET? Vejo por padrão que o TLS 1.1 e 1.2 não estão habilitados, precisamos habilitá-lo através do registro? RE http://support.microsoft.com/kb/245030 .
Após um pouco de investigação, acredito que as configurações do registro não terão efeito, pois se aplicam ao IIS (subchave do servidor) e navegadores (subchave do cliente).
Desculpe, este post se transformou em várias perguntas, seguido de respostas "talvez".
Respostas:
Alguns dos que deixaram comentários comentaram que definir
System.Net.ServicePointManager.SecurityProtocol
valores específicos significa que seu aplicativo não poderá tirar proveito de versões futuras do TLS que podem se tornar os valores padrão em futuras atualizações do .NET. Em vez de especificar uma lista fixa de protocolos, você pode ativar ou desativar os protocolos que você conhece e se preocupa, deixando os outros como estão.Para ativar o TLS 1.1 e 1.2 sem afetar outros protocolos:
Observe o uso de
|=
para ativar essas bandeiras sem desativar outras.Para desativar o SSL3 sem afetar outros protocolos:
fonte
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod, que depende das mesmas bibliotecas de estrutura .NET subjacentes.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
O padrão
System.Net.ServicePointManager.SecurityProtocol
no .NET4.0/4.5
éSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
suporta atéTLS 1.0
enquanto.NET 4.5
suporta atéTLS 1.2
No entanto, um direcionamento de aplicativo
.NET 4.0
ainda pode suportar atéTLS 1.2
se.NET 4.5
estiver instalado no mesmo ambiente..NET 4.5
instala sobre.NET 4.0
, substituindoSystem.dll
.Eu verifiquei isso observando o protocolo de segurança correto definido no tráfego com
fiddler4
e definindo manualmente os valores enumerados em um.NET 4.0
projeto:Referência:
Se você tentar o hack em um ambiente com o ONLY
.NET 4.0
instalado, você receberá a exceção:No entanto, eu não recomendaria esse "hack", pois um patch futuro etc. poderá quebrá-lo. *
Portanto, decidi que o melhor caminho para remover o suporte
SSLv3
é:.NET 4.5
Adicione o seguinte ao código de inicialização automática para substituir o padrão e o futuro:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Alguém me corrija se esse hack estiver errado, mas testes iniciais eu vejo que funcionam
fonte
ServicePointManager.cs
ver referencesource.microsoft.com/#System/net/System/Net/....NET 4.5
padrões do Tls12 - mas como você colocou aqui, isso não acontece. Dá-lhe a opção de usá-lo paraSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
como por support.microsoft.com/en-us/help/3069494/...Você pode substituir o comportamento padrão no seguinte registro:
e
Para detalhes, consulte a implementação de
ServicePointManager
.fonte
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(e / ou/reg:32
)Crie um arquivo de texto com uma
.reg
extensão e o seguinte conteúdo:Ou faça o download da seguinte fonte:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Clique duas vezes para instalar ...
fonte
Descobri que, quando especifico apenas o TLS 1.2, ele ainda será negociado para 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Especifiquei isso no método de inicialização Global.asax para meu aplicativo da web .net 4.5.
fonte
O código a seguir será:
Constantes:
Outros protocolos não serão afetados. Isso torna isso compatível com protocolos futuros (Tls1.3, etc).
Código
Resultado
fonte
Eu tive o problema quando meu cliente atualizou o TLS de 1.0 para 1.2. Meu aplicativo está usando o .net framework 3.5 e é executado no servidor. Então eu o corrigi desta maneira:
Antes de chamar HttpWebRequest.GetResponse (), adicione este comando:
Extensões 2 DLLs adicionando 2 novas classes: System.Net e System.Security.Authentication
Baixar lote:
Para lote de download e mais detalhes, você pode ver aqui:
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-e-servidor-2008-r2-sp1
fonte
O mecanismo de alteração do registro funcionou para mim depois de uma luta. Na verdade, meu aplicativo estava rodando como 32 bits. Então eu tive que mudar o valor no caminho.
O tipo de valor precisa ser DWORD e valor acima de 0. Melhor uso 1.
fonte
Estou executando o .NET 4.5.2 e não fiquei satisfeito com nenhuma dessas respostas. Como estou conversando com um sistema que suporta TLS 1.2 e vendo como SSL3, TLS 1.0 e TLS 1.1 estão todos quebrados e inseguros para uso, não quero habilitar esses protocolos. No .NET 4.5.2, os protocolos SSL3 e TLS 1.0 são habilitados por padrão, o que posso ver no código inspecionando
ServicePointManager.SecurityProtocol
. No .NET 4.7, há o novoSystemDefault
modo de protocolo que entrega explicitamente a seleção do protocolo ao sistema operacional, onde acredito que seria apropriado confiar no registro ou em outras configurações do sistema. No entanto, isso não parece ser suportado no .NET 4.5.2. No interesse de escrever código compatível com versões anteriores, isso continuará a tomar as decisões corretas, mesmo quando o TLS 1.2 for inevitavelmente quebrado no futuro, ou quando eu atualizar para o .NET 4.7+ e entregar mais responsabilidades pela seleção de um protocolo apropriado para o SO , Adotei o seguinte código:Esse código detectará quando um protocolo não seguro conhecido estiver ativado e, nesse caso, removeremos esses protocolos não seguros. Se nenhum outro protocolo explícito permanecer, forçaremos a ativação do TLS 1.2, como o único protocolo seguro conhecido suportado pelo .NET neste momento. Esse código é compatível com versões anteriores, pois levará em consideração novos tipos de protocolos que não conhece sobre a adição no futuro e também funcionará bem com o novo
SystemDefault
no .NET 4.7, o que significa que não precisarei visitar novamente esse código no futuro. Eu recomendo fortemente a adoção de uma abordagem como essa, em vez de codificar qualquer estado de protocolo de segurança em particular incondicionalmente; caso contrário, você precisará recompilar e substituir seu cliente por uma nova versão para atualizar para um novo protocolo de segurança quando o TLS 1.2 está inevitavelmente quebrado ou é mais provável que você tenha que deixar os protocolos inseguros existentes ativados por anos no seu servidor, tornando a sua organização alvo de ataques.fonte
SecurityProtocolType.SystemDefault
sinalizador é avaliado0
, portanto, verificarif (securityProtocols == 0)
com o sinalizador inclusivo ou com sinal de bits do TLS 1.2 sempre incluirá o TLS 1.2, mesmo depois de "interrupções", certo? Não tiro nítido aqui. Estou realmente tentando encontrar o melhor caminho a seguir.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(sem bloco se) não mantém SystemDefault, os securityProtocols só têm TLS2 posteriormente. Então, quando o valor é SystemDefault, nenhum valor deve ser atualizado? Com relação ao encaminhamento compatível, você está assumindo que o sistema operacional cuidaria de habilitar um protocolo mais novo como o TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
SecurityProtocolType` enum tem um[Flags]
atributo, e o valor de enumeração SystemDefault é0
, o valor SystemDefault será removido, mesmo que tenha sido definido anteriormente. O resultado final é que você pode definir o valorSevicePointManager.SecurityProtocol
0 ou qualquer combinação dos outros valores de enumeração. Se você configurá-lo como SystemDefault, basicamente está optando por não especificar o protocolo e deixar o sistema operacional decidir.A Microsoft publicou recentemente as práticas recomendadas para isso. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Resumo
Alvo .Net Framework 4.7, remova qualquer código que defina o SecurityProtocol, assim o sistema operacional garantirá que você use a solução mais segura.
NB: Você também precisará garantir que a versão mais recente do TLS seja suportada e ativada no seu sistema operacional.
Para mais informações e estruturas mais antigas, consulte o link MS.
fonte
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, eis um script do Powershell que define as chaves de registro mencionadas acima:
fonte
Uma alternativa à codificação embutida
ServicePointManager.SecurityProtocol
ou à chave SchUseStrongCrypto explícita, conforme mencionado acima:Você pode dizer ao .NET para usar as configurações SCHANNEL padrão com a chave SystemDefaultTlsVersions,
por exemplo:
fonte
A solução BEST para esse problema parece ser atualizar para pelo menos o .NET 4.6 ou posterior, que escolherá automaticamente protocolos fortes e cifras fortes.
Se você não pode atualizar para o .NET 4.6, o conselho de definir
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
E usando as configurações do 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
Resultados no uso de algo diferente do TLS 1.0 e uma cifra forte.
Nos meus testes, apenas a configuração no Wow6432Node fez alguma diferença, mesmo que meu aplicativo de teste tenha sido criado para Qualquer CPU.
fonte
De acordo com as práticas recomendadas de TLS (Transport Layer Security) com o .NET Framework : Para garantir que os aplicativos .NET Framework permaneçam seguros, a versão do TLS não deve ser codificada. Em vez disso, defina as chaves do registro:
SystemDefaultTlsVersions
eSchUseStrongCrypto
:fonte
Se você pode usar o .NET 4.7.1 ou mais recente, ele usará o TLS 1.2 como o protocolo mínimo com base nos recursos do sistema operacional. Por recomendação da Microsoft:
fonte
Para chave: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Valor: SchUseStrongCrypto
Você deve definir o valor como 1.
fonte