Configurar o TLS 1.3
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores
Este artigo explica como:
- Configurar uma instância do SQL Server 2022 (16.x) para usar o protocolo TLS 1.3 e TLS 1.2
- Verificar se os protocolos estão operacionais
- Desativar protocolos mais antigos e inseguros, incluindo TLS 1.0 e 1.1
Requisitos
O suporte a TLS 1.3 no SQL Server 2022 (16.x) exige:
- Windows Server 2022
- SQL Server 2022 (16.x) com atualização cumulativa 1 ou posterior
- A instância do SQL Server usa TCP/IP como um protocolo de rede
- Um certificado de servidor X.509 válido instalado junto com sua chave privada
Importante
Este documento pressupõe que seus requisitos incluem TLS 1.3 e TLS 1.2 em curto prazo e apenas TLS 1.3 em longo prazo.
SQL Server e TLS
O SQL Server não executa operações TLS em si, em vez disso, esse trabalho é executado pelo Windows usando o Schannel SSP. O Schannel é um Provedor de Suporte de Segurança (SSP) que contém e expõe a implementação da Microsoft de protocolos de segurança padrão da Internet, como TLS. Schannel é para o Windows o que o OpenSSL é para o Linux.
A configuração do TLS para SQL Server exige a configuração do TLS para Windows.
Com o SQL Server 2022 (16.x) no Windows Server 2022, o SQL Server oferece suporte a TLS 1.0, 1.1, 1.2 e 1.3. Para verificar isso, use o código .NET disponível no GitHub em TlsTest. A saída da ferramenta é semelhante a:
Trying Ssl2
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Ssl3
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Tls
Tls using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Trying Tls11
Tls11 using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Trying Tls12
Tls12 using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Trying Tls13
Tls13 using TLS_AES_256_GCM_SHA384
Configurar o Windows para usar apenas TLS 1.2 e TLS 1.3
O Windows tem um conjunto de chaves do Registro emHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
que controla as versões do protocolo TLS, bem como conjuntos de criptografia. Para esse cenário, somente as versões de protocolo que afetam os servidores são importantes, porque a instância do SQL Server atua como um servidor.
O seguinte script do PowerShell atualiza o Registro para habilitar ou desabilitar o TLS 1.0 e o TLS 1.1 quando usados por servidores:
Aviso
Antes de continuar, faça backup do registro. Isso permitirá que você restaure o registro no futuro, se necessário.
# Learn more at https://learn.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings?tabs=diffie-hellman
Set-StrictMode -Version Latest
$base = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\'
$protocols = [ordered]@{
"SSL 2.0" = $false
"SSL 3.0" = $false
"TLS 1.0" = $false
"TLS 1.1" = $false
"TLS 1.2" = $true
"TLS 1.3" = $true
}
foreach ($version in $protocols.Keys) {
$enabledValue = $protocols[$version]
$path = $base + $version + '\Server'
New-Item $path -Force | Out-Null
New-ItemProperty -Path $path `
-Name 'Enabled' `
-Value $enabledValue `
-PropertyType 'DWord' `
-Force | Out-Null
Write-Host "$version is $enabledValue."
}
Esse código está disponível no GitHub.
Depois de executar esse script, reinicie o processo do SQL Server para que as novas configurações do TLS entrem em vigor. Se você executar o código mencionado no início do artigo, ele retornará:
Trying Ssl2
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Ssl3
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Tls
Received an unexpected EOF or 0 bytes from the transport stream.
Exception:
Trying Tls11
Received an unexpected EOF or 0 bytes from the transport stream.
Exception:
Trying Tls12
Tls12 using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Trying Tls13
Tls13 using TLS_AES_256_GCM_SHA384
Observe que o SSL 2.0, o SSL 3.0, o TLS 1.0 e o TLS 1.1 não conseguem se conectar, mas tanto o TLS 1.2 quanto o TLS 1.3 são bem-sucedidos.
Após a atualização do Registro, o Windows e essa instância do SQL Server só permitem conexões TLS 1.2 e TLS 1.3. Posteriormente, quando mais clientes oferecerem suporte ao TLS 1.3, você também poderá desabilitar o TLS 1.2.
Definir instância do SQL Server para forçar criptografia estrita
A etapa final é definir a instância para utilizar Force Strict Encryption
. Com Force Strict Encryption
, a instância SQL usa uma versão com suporte do protocolo TDS (TDS 8.0 ou posterior).
Use o SQL Server Configuration Manager para definir essa configuração.
Expanda a Configuração de Rede do SQL Server
Clique com o botão direito do mouse em Protocolos para
<instance name>
e selecione PropriedadesO nome de instância padrão é MSSQLSERVER.
Na guia Sinalizadores, defina Forçar criptografia estrita como Sim
Verificar a segurança
Esta seção demonstra como usar o Wireshark, OpenSSL e Nmap para verificar a criptografia.
Wireshark
Você pode usar sniffers de rede para determinar a versão do protocolo TLS e o conjunto de codificação combinado. Você pode achar alguns dados confusos. Se você olhar para a captura de tela abaixo do Wireshark, ela mostra que o pacote é uma Camada de Registro TLS v1.3, mas a versão do protocolo é TLS 1.2 e a versão do Protocolo de aperto de mãos também é TLS 1.2. Tudo isso faz parte da especificação TLS 1.2 e é correto e esperado. A versão do protocolo combinada está na seção Extensões e, como você pode ver, supported_versions é o TLS 1.3.
OpenSSL
Você também pode usar o openssl para descobrir as informações TLS combinadas.
Use o seguinte comando:
openssl s_client 127.0.0.1:1433
O comando retorna resultados como:
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID : 516D56D99088BCDE1 <snip> 098EDB1A
Session-ID-ctx:
Resumption PSD: B2B9CB92B59aa1 <snip> BD824CBA
PSK identity: None
Nmap
A versão atual do Nmap, versão 7.94, parece não detectar TLS 1.3 ao usar:
nmap -sV --script ssl-enum-ciphers -p 1433 127.0.0.1
.