Primeiro o problema: desde que apliquei o patch mais recente ao SQL Server 2008 R2 (lançado em 3 de março de 2016) que deveria ter levado meu servidor para compilar 10.50.6542, não consigo mais me conectar. Este patch é para fornecer suporte a TLS 1.2.
O erro que estou recebendo (ao tentar conectar usando uma ferramenta cliente diretamente no servidor) é
"A connection was succesfully established with the server, but then an error occurred during the pre-login handshake"
O servidor é um Windows Server 2012 R2 e está executando o NET Framework 4.6.1 (alguns posts apontam para uma versão mais antiga do .NET framework causando esse problema, mas esse não é o meu caso).
Eu tentei executar os seguintes pacotes para ver se isso resolveria ...
- SQL Server Native Client (x86 e x64)
- Pacote cumulativo de hotfix 3106993 para o .NET Framework 2.0 SP2 no Windows Server 2012 R2 e Windows 8.1
- Pacote cumulativo de hotfix 3106994 para o .NET Framework 4.0 no Windows
- Pacote cumulativo de hotfix 3099845 para o .NET Framework 4.5.2, 4.5.1 e 4.5
... Nada disso foi necessário, e nada ajudou...
Alguém já experimentou isso? Alguma ideia ou sugestão?
Obrigado!
Uma atualização 24 horas depois , inspecionei o log de erros do SQL Server procurando entradas que incluíssem apenas um início, 5 tentativas de login com falha e uma parada. De todas as mensagens nesse período de tempo (107 entradas no total), a única mensagem que inclui algo como um erro é
The SQL Server Network Interface library could not register the Service Principal Name (SPN) for the SQL Server service. Error: 0x2098, state: 15. Failure to register an SPN may cause integrated authentication to fall back to NTLM instead of Kerberos. This is an informational message. Further action is only required if Kerberos authentication is required by authentication policies.
Esta mensagem, no entanto, foi relatada na inicialização do servidor antes mesmo de eu aplicar o patch, então estou 100% confiante de que é um arenque vermelho. Nenhum log é inserido no log de erros do SQL Server como resultado das tentativas de logon com falha.
Outra atualização
Com base nas sugestões que recebi das pessoas aqui, baixei e instalei a versão mais recente do SSMS (17.3) no servidor. Quando tentei conectar desta vez, recebi um erro diferente, então parece que estou avançando, mas ainda não cheguei lá.
Portanto, parece que é verdade que as versões antigas do SSMS têm como alvo o .net 3.5 e mesmo se você tiver versões mais recentes do .net framework as conexões do cliente não funcionarão, a questão agora é por que ainda recebo este "Nenhum processo está do outro lado do canal", mesmo quando a maioria dos componentes do cliente foi atualizada.
Mais algumas coisas que investiguei (e descartei)
- A ordem do “protocolo do cliente” no SQL Server Configuration Manager parece ser a correta, pois o TCP/IP está no topo. Isso foi sugerido como uma possível causa de problemas, mas no meu caso está tudo configurado adequadamente (aparentemente)
Tentei instalar o “Microsoft ODBC Driver for SQL Server” conforme sugerido no suporte TLS 1.2 para Microsoft SQL Server , mas isso também não fez diferença. Após a instalação, a mensagem de erro é a mesma
Tentei adicionar as chaves do registro em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2 (também como sugerido no mesmo artigo ). Mesmo erro…
Finalmente! depois de 3 dias tentando de tudo sob o sol, encontrei a causa raiz do meu problema.
O ah! momento foi quando me juntei a um grupo tentando entender por que esse patch estava sendo implantado bem em outros servidores e não neste em particular.
Percebemos que algo diferente (entre outras coisas... que listamos em um bloco de notas bem organizado) foi que esse SQL Server 2008 R2 foi configurado para criptografia em trânsito (também conhecido como criptografia SSL) por meio de certificados e algumas configurações no gerenciador de configuração do SQL Server, a saber :
Em Protocols for [Instance_Name] e depois em Properties (aba certificados) tivemos que selecionar o certificado que criamos para fins de comunicações criptografadas.
Nessa mesma janela (guia de sinalizadores), definimos a opção ForceEncryption para o Mecanismo de Banco de Dados como Sim
Então começamos a pensar... e se o problema for o próprio certificado?. Então fomos em frente e removemos a configuração de criptografia (o patch para o SQL Server Build 10.50.6542 ainda aplicado) e a conexão começou a funcionar, confirmando que a combinação do patch com nossa configuração SSL estava maluca.
Após mais investigações e por meio de um processo de eliminação, reduzimos o problema aos certificados que estávamos usando. O certificado foi criado naquela época com makecert (para criar um certificado autoassinado) e NÃO estava usando o parâmetro -a. Este parâmetro informa ao makecert qual algoritmo de Hash deve ser usado. Se não for fornecido, o makecert usará o algoritmo de hash de assinatura MD5 padrão que não é compatível com o TLS 1.2.
Também no TLS 1.2 RFC você pode ver isso explicitamente…
Portanto, para corrigir esse problema, a solução é adicionar o parâmetro -a SHA256 ao makecert (certifique-se de usar o makecert versão 6.3.9600.17298 e não o antigo 5.1313790.0 porque esse não suporta SHA256 como parâmetro ).
Estou escrevendo tudo isso já que todo o enigma me levou 3 dias para descobrir e espero que algum dia alguém se beneficie disso. Se apenas a Microsoft tivesse incluído em letras BIG BOLD que o MD5 não é mais suportado no artigo em que o patch é descrito!
Obrigado a @Mr.Brownstone e @sepupic por toda a ajuda!
O TLS 1.2 não se tornou o protocolo de segurança padrão até o .NET 4.6 e nem era uma opção com suporte até o .NET 4.5, portanto, se você estiver usando um cliente direcionado a um tempo de execução do .NET inferior a 4.5, ele não poderá comunicar usando TLS 1.2 por padrão.
Em seu cenário específico, o cliente é o SQL Server Management Studio. As versões do estúdio de gerenciamento até 2014, inclusive, usavam o .NET 3.5 SP1 como o tempo de execução de destino - o que, infelizmente, impedirá que você se conecte usando o TLS 1.2 como está.
Para solucionar seu problema, atualize sua instalação do estúdio de gerenciamento para a versão mais recente, pois isso é direcionado ao .NET 4.6.1 e usará o TLS 1.2 como o protocolo de segurança padrão.
Página de download do SSMS
Uma segunda solução, se você não conseguir atualizar para a versão mais recente do SSMS, é fazer algumas alterações no registro que forçarão o Windows Server a ignorar o protocolo especificado pelo .NET 3.5 e usar o TLS 1.2. Eu não recomendaria isso (e se você não puder atualizar o SSMS, provavelmente não terá permissão para alterar as configurações do registro), mas incluí as informações para ser completa.
Detalhes sobre como forçar o .NET 3.5 a usar o TLS 1.2 e quais chaves de registro precisam ser alteradas podem ser encontrados abaixo:
Suporte para versões padrão do sistema TLS incluídas no .NET Framework 3.5 no Windows Server 2012