Crittografa le connessioni a SQL Server su Linux

Si applica a:SQL Server su Linux

SQL Server in Linux può usare TLS (Transport Layer Security) per crittografare i dati trasmessi attraverso una rete tra un'applicazione client e un'istanza di SQL Server.

Supporto dei sistemi operativi

SQL Server supporta gli stessi protocolli TLS sia in Windows che in Linux: 1.3, 1.2, 1.1 e 1.0.

A partire da SQL Server 2025 (17.x):

  • TLS 1.3 è abilitato per impostazione predefinita
  • SUSE Linux Enterprise Server (SLES) non è supportato

I passaggi per configurare TLS sono specifici del sistema operativo in cui è in esecuzione SQL Server.

Note

TLS non è supportato per gli endpoint del mirroring del database del gruppo di disponibilità AlwaysOn.

Requisiti per i certificati

Assicurarsi che i certificati siano conformi ai requisiti seguenti:

  • L'ora di sistema corrente deve essere successiva al valore della proprietà Valid from del certificato e antecedente al valore della proprietà Valid to del certificato.

  • Il certificato deve essere destinato all'autenticazione del server. Ciò richiede che la proprietà Enhanced Key Usage del certificato specifichi Server Authentication (1.3.6.1.5.5.7.3.1).

  • Il certificato deve essere creato utilizzando l'opzione KeySpec di AT_KEYEXCHANGE. In genere, la proprietà di utilizzo della chiave del certificato (KEY_USAGE) include anche la crittografia a chiave (CERT_KEY_ENCIPHERMENT_KEY_USAGE).

  • La proprietà Subject del certificato deve specificare che il nome comune (CN, Common Name) corrisponde al nome host oppure al nome di dominio completo (FQDN, Fully Qualified Domain Name) del server.

    Note

    I certificati wildcard sono supportati.

Configurazione delle librerie OpenSSL per l'utilizzo (facoltativo)

È possibile creare nella directory /opt/mssql/lib/ collegamenti simbolici che facciano riferimento alle librerie libcrypto.so e libssl.so da usare per la crittografia. Questa opzione è utile se si vuole imporre a SQL Server l'uso di una versione specifica di OpenSSL diversa da quella predefinita fornita dal sistema. Se questi collegamenti simbolici non sono presenti, SQL Server caricherà le librerie OpenSSL predefinite configurate nel sistema.

Questi collegamenti simbolici devono essere denominati libcrypto.so e libssl.so ed essere inseriti nella directory /opt/mssql/lib/.

Note

Per un esempio di utilizzo di Let's Encrypt per generare un certificato, vedere il post del blog Sbloccare la potenza dei dati in Azure con SQL Server su macchine virtuali di Azure Linux e la ricerca con l'intelligenza artificiale di Azure.

Overview

TLS viene usato per crittografare le connessioni da un'applicazione client a SQL Server. Se configurato correttamente, TLS garantisce la sia privacy che l'integrità dei dati per le comunicazioni tra il client e il server. Le connessioni TLS possono essere avviate dal client oppure dal server.

Note

TLS non è supportato per gli endpoint del mirroring del database del gruppo di disponibilità AlwaysOn.

La sezione seguente descrive la configurazione della crittografia avviata dal client.

Generare il certificato

/CN deve corrispondere al nome di dominio completo dell'host di SQL Server.

Caution

Questo esempio usa un certificato autofirmato. Non usare certificati autofirmati per gli scenari di produzione. È consigliabile usare i certificati della CA.

Assicurati che le cartelle in cui salvi i tuoi certificati e le chiavi private siano accessibili all'utente mssql o al gruppo e abbiano permessi impostati su 700 (drwx------). Puoi creare cartelle manualmente con i permessi impostati su 700 (drwx------) e di proprietà dell'utente o del mssql gruppo. In alternativa, imposta i permessi su 755 (drwxr-xr-x) e assicurati che le cartelle siano accessibili al mssql gruppo. Ad esempio, puoi creare una cartella chiamata sslcert sotto il percorso /var/opt/mssql/ e salvare il certificato e la chiave privata con i permessi sui file impostati su 600, come mostrato nel seguente esempio.

openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=mssql.contoso.com' -keyout mssql.key -out mssql.pem -days 365
sudo chown mssql:mssql mssql.pem mssql.key
sudo chmod 600 mssql.pem mssql.key
# Save the certificate to the certs folder under /etc/ssl/
sudo mv mssql.pem /etc/ssl/certs/
# Save the private key to the private folder under /etc/ssl/
sudo mv mssql.key /etc/ssl/private/

Configurare SQL Server

Per SQL Server 2022 (16.x) e versioni precedenti:

systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server

Per SQL Server 2025 (17.x):

systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server

Registrare il certificato nel computer client (Windows, Linux o macOS)

  • Se stai usando un certificato firmato dalla CA, copia il certificato dell'Autorità di Certificazione (CA) invece del certificato utente sulla macchina client.

  • Se stai usando il certificato autofirmato, copia il .pem file nella cartella della tua distribuzione ed esegui il comando per abilitarlo:

    • Ubuntu: Copia il certificato su /usr/share/ca-certificates/, rinomina la sua estensione in .crt, e usa dpkg-reconfigure ca-certificates per abilitarlo come certificato CA di sistema.

    • RHEL: Copia il certificato e /etc/pki/ca-trust/source/anchors/ utilizzalo update-ca-trust per abilitarlo come certificato CA di sistema.

    • SUSE: Copia il certificato e /usr/share/pki/trust/anchors/ usalo update-ca-certificates per abilitarlo come certificato CA di sistema.

    • Windows: Importa il file .pem come certificato in Utente corrente>Autorità di certificazione radice attendibili>.

    • macOS:

      • Copia il certificato su /usr/local/etc/openssl/certs.

      • Eseguire il comando seguente per ottenere il valore hash:

        /usr/local/Cellar/openssl/1.0.2l/openssl x509 -hash -in mssql.pem -noout
        
      • Rinominare il certificato con il valore. Ad esempio, usare mv mssql.pem dc2dd900.0. Assicurati che dc2dd900.0 sia in /usr/local/etc/openssl/certs.

Esempi di stringhe di connessione

Caution

La password deve seguire la politica predefinita di SQL Server password. Per impostazione predefinita, la password deve essere composta da almeno otto caratteri e contenere caratteri di tre delle quattro categorie seguenti: lettere maiuscole, lettere minuscole, cifre in base 10 e simboli. Le password possono contenere fino a 128 caratteri. Usare password il più possibile lunghe e complesse.

  • SQL Server Management Studio

    Screenshot della finestra di dialogo di connessione di SQL Server Management Studio.

  • sqlcmd

    sqlcmd -S <sqlhostname> -N -U sa -P '<password>'

  • ADO.NET

    "Encrypt=True; TrustServerCertificate=False;"

  • ODBC

    "Encrypt=Yes; TrustServerCertificate=no;"

  • JDBC

    "encrypt=true; trustServerCertificate=false;"

Errori di connessione comuni

Messaggio d'errore Correzione
The certificate chain was issued by an authority that is not trusted. Questo errore si verifica quando i client non riescono a verificare la firma sul certificato presentato da SQL Server durante l'handshake TLS. Verificare che il client consideri attendibile direttamente il certificato di SQL Server oppure la CA che ha firmato il certificato di SQL Server.
The target principal name is incorrect. Assicurati che il campo nome comune sul certificato di SQL Server corrisponda al nome del server specificato nella stringa di connessione del client.
An existing connection was forcibly closed by the remote host. Questo errore può verificarsi quando il client non supporta la versione del protocollo TLS richiesta da SQL Server. Se ad esempio la configurazione di SQL Server richiede TLS 1.2, verificare che i client supportino anche il protocollo TLS 1.2.

Ubuntu 20.04 e altre versioni recenti della distribuzione Linux

Sintomo

Quando un'istanza di SQL Server in Linux carica un certificato creato con un algoritmo di firma che usa meno di 112 bit di sicurezza (ad esempio MD5, SHA-1), è possibile osservare un errore di connessione, come illustrato di seguito:

A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - An existing connection was forcibly closed by the remote host.) (Microsoft SQL Server, Error: 10054)

L'errore è dovuto al livello di sicurezza 2 di OpenSSL abilitato per impostazione predefinita in Ubuntu 20.04 e versioni successive. Il livello di sicurezza 2 impedisce la creazione di connessioni TLS con meno di 112 bit di sicurezza.

Soluzione

Installare un certificato con un algoritmo di firma che usa almeno 112 bit di sicurezza. Gli algoritmi di firma che soddisfano questo requisito includono SHA-224, SHA-256, SHA-384 e SHA-512.