Configurare TLS 1.3
Si applica a: SQL Server 2022 (16.x) e versioni successive
Questo articolo spiega come:
- Configurare un'istanza di SQL Server 2022 (16.x) per l'uso di Transport Layer Security (TLS) 1.3 e TLS 1.2
- Verificare che i protocolli siano operativi
- Disabilitare i protocolli meno recenti e non sicuri, tra cui TLS 1.0 e 1.1
Requisiti
Il supporto di TLS 1.3 in SQL Server 2022 (16.x) richiede:
- Windows Server 2022
- SQL Server 2022 (16.x) con aggiornamento cumulativo 1 o versione successiva
- L'istanza di SQL Server usa TCP/IP come protocollo di rete
- Un certificato server X.509 valido installato insieme alla relativa chiave privata
Importante
Questo documento presuppone che i requisiti includano TLS 1.3 e TLS 1.2 a breve termine e solo TLS 1.3 a lungo termine.
SQL Server e archiviazione thread-local (TLS)
SQL Server non esegue operazioni TLS, ma questa operazione viene eseguita da Windows tramite SSP Schannel. Schannel è un provider di supporto per la sicurezza (SSP) che contiene ed espone l'implementazione di Microsoft di protocolli di sicurezza standard Internet, ad esempio TLS. Schannel è per Windows che cos'è OpenSSL in Linux.
La configurazione di TLS per SQL Server richiede la configurazione di TLS per Windows.
Con SQL Server 2022 (16.x) in Windows Server 2022, SQL Server supporta TLS 1.0, 1.1, 1.2 e 1.3. Per verificarlo, usare il codice .NET disponibile in GitHub in TlsTest. L'output dello strumento è simile al seguente:
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
Configurare Windows per l'uso solo di TLS 1.2 e TLS 1.3
Windows dispone di un set di chiavi del Registro di sistema in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
che controllano le versioni del protocollo TLS e le suite di crittografia. Per questo scenario, solo le versioni del protocollo che influiscono sui server sono importanti perché l'istanza di SQL Server funge da server.
Lo script di PowerShell seguente aggiorna il Registro di sistema per abilitare o disabilitare TLS 1.0 e TLS 1.1 quando usato dai server:
Avviso
Prima di procedere, eseguire il backup del Registro di sistema. In questo modo sarà possibile ripristinare il Registro di sistema in futuro, se necessario.
# 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."
}
Il codice è disponibile in GitHub.
Dopo aver eseguito questo script, riavviare il processo di SQL Server per rendere effettive le nuove impostazioni TLS. Se si esegue ora il codice indicato all'inizio dell'articolo, viene restituito quanto riportato di seguito:
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
Si noti che SSL 2.0, SSL 3.0, TLS 1.0 e TLS 1.1 non riescono a connettersi, ma sia TLS 1.2 che TLS 1.3 hanno esito positivo.
Dopo l'aggiornamento del Registro di sistema, Windows e questa istanza di SQL Server consentono solo le connessioni TLS 1.2 e TLS 1.3. Successivamente, quando più client supportano TLS 1.3, è anche possibile disabilitare TLS 1.2.
Impostare l'istanza di SQL Server per forzare la crittografia rigorosa
Il passaggio finale consiste nell'impostare l'istanza per l'uso di Force Strict Encryption
. Con Force Strict Encryption
, l'istanza di SQL usa una versione supportata del flusso di dati tabulari (TDS 8.0 o versione successiva).
Usare Gestione configurazione SQL Server per impostare questa impostazione.
Espandere Configurazione di rete SQL Server
Fare clic con il pulsante destro del mouse su Protocolli per
<instance name>
, quindi selezionare ProprietàIl nome dell'istanza predefinita è MSSQLSERVER.
Nella scheda Flag, impostare Force Strict Encryption su Sì
Verificare la sicurezza
Questa sezione illustra come usare Wireshark, OpenSSL e Nmap per verificare la crittografia.
Wireshark
È possibile usare gli sniffer di rete per determinare la versione del protocollo TLS e la suite di crittografia concordata. Si potrebbero trovare alcuni dati confusi. Se si osserva lo screenshot seguente da Wireshark, il pacchetto è un livello di record TLS v1.3, ma la versione del protocollo è TLS 1.2 e la versione del protocollo Handshake Protocol è anche TLS 1.2. Questa è una parte della specifica TLS 1.2 ed è corretta e prevista. La versione del protocollo concordata si trova nella sezione Estensioni e, come si può notare, supported_versions è TLS 1.3.
OpenSSL
È anche possibile usare openssl per individuare le informazioni TLS concordate.
Usare il comando seguente:
openssl s_client 127.0.0.1:1433
Il comando restituisce risultati come:
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
La versione corrente di Nmap, versione 7.94, sembra non rilevare TLS 1.3 quando si usa:
nmap -sV --script ssl-enum-ciphers -p 1433 127.0.0.1
.