Crittografia delle connessioni a SQL Server in LinuxEncrypting Connections to SQL Server on Linux

QUESTO ARGOMENTO SI APPLICA A: SìSQL Server (solo Linux)nonDatabase SQL di AzurenonAzure SQL Data Warehousenon Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (Linux only)noAzure SQL DatabasenoAzure SQL Data WarehousenoParallel Data Warehouse

SQL ServerSQL Server in Linux possono usare Transport Layer Security (TLS) per crittografare i dati trasmessi attraverso una rete tra un'applicazione client e un'istanza di SQL ServerSQL Server. on Linux can use Transport Layer Security (TLS) to encrypt data that is transmitted across a network between a client application and an instance of SQL ServerSQL Server. SQL ServerSQL Server supporta gli stessi protocolli TLS in Windows e Linux: TLS 1.2, 1.1 e 1.0. supports the same TLS protocols on both Windows and Linux: TLS 1.2, 1.1, and 1.0. Tuttavia, è specifica per il sistema operativo in cui la procedura per configurare TLS SQL ServerSQL Server è in esecuzione.However, the steps to configure TLS are specific to the operating system on which SQL ServerSQL Server is running.

Requisiti per i certificatiRequirements for Certificates

Prima di iniziare, è necessario assicurarsi che i certificati di rispettano i requisiti seguenti:Before getting started, you need to make sure your certificates follow these requirements:

  • Dopo la valido dalla proprietà del certificato e prima la valido alla proprietà del certificato deve essere l'ora di sistema corrente.The current system time must be after the Valid from property of the certificate and before the Valid to property of the certificate.
  • Il certificato deve essere destinato all'autenticazione del server.The certificate must be meant for server authentication. Ciò richiede che la proprietà Enhanced Key Usage del certificato per specificare l'autenticazione Server (1.3.6.1.5.5.7.3.1).This requires the Enhanced Key Usage property of the certificate to specify Server Authentication (1.3.6.1.5.5.7.3.1).
  • Il certificato deve essere creato usando l'opzione KeySpec di AT_KEYEXCHANGE.The certificate must be created by using the KeySpec option of AT_KEYEXCHANGE. Proprietà di utilizzo della chiave del certificato (KEY_USAGE) include in genere, anche la crittografia chiave (CERT_KEY_ENCIPHERMENT_KEY_USAGE).Usually, the certificate's key usage property (KEY_USAGE) also includes key encipherment (CERT_KEY_ENCIPHERMENT_KEY_USAGE).
  • La proprietà Subject del certificato deve indicare che il nome comune (CN) sia lo stesso come il nome host o nome di dominio completo (FQDN) del computer del server.The Subject property of the certificate must indicate that the common name (CN) is the same as the host name or fully qualified domain name (FQDN) of the server computer. Nota: i certificati con caratteri jolly sono supportati.Note: Wild Card Certificates are supported.

PanoramicaOverview

TLS è usato per crittografare le connessioni da un'applicazione client per SQL ServerSQL Server.TLS is used to encrypt connections from a client application to SQL ServerSQL Server. Quando è configurato correttamente, TLS fornisce privacy e integrità dei dati per le comunicazioni tra client e server.When configured correctly, TLS provides both privacy and data integrity for communications between the client and the server. Le connessioni TLS possono essere inizializzata sul lato client o server avviate.TLS connections can either be client initiated or server initiated.

Client ha avviato la crittografiaClient Initiated Encryption

  • Genera certificato (/CN deve corrispondere il nome di dominio completo di host di SQL Server)Generate certificate (/CN should match your SQL Server host fully qualified domain name)

Nota

Per questo esempio viene usato un certificato autofirmato, questo non usare per gli scenari di produzione.For this example we use a Self-Signed Certificate, this should not be used for production scenarios. È consigliabile usare i certificati della CA.You should use CA certificates.

    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   
    sudo mv mssql.pem /etc/ssl/certs/ 
    sudo mv mssql.key /etc/ssl/private/ 
  • Configurare SQL ServerConfigure SQL Server

      systemctl stop mssql-server 
      cat /var/opt/mssql/mssql.conf 
      sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssqlfqdn.pem 
      sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssqlfqdn.key 
      sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2 
      sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0 
    
  • Registrare il certificato nel computer client (Windows, Linux o macOS)Register the certificate on your client machine (Windows, Linux, or macOS)

    • Se si usa certificato CA firmato, è necessario copiare il certificato di autorità di certificazione (CA) anziché il certificato utente al computer client.If you are using CA signed certificate, you have to copy the Certificate Authority (CA) certificate instead of the user certificate to the client machine.
    • Se si usa il certificato autofirmato, è sufficiente copiare il file con estensione PEM nelle cartelle seguenti corrispondente alla distribuzione ed eseguire i comandi per consentire loroIf you are using the self-signed certificate, just copy the .pem file to the following folders respective to distribution and execute the commands to enable them
      • Ubuntu: certificato di copia al /usr/share/ca-certificates/ rename estensione CRT usare i certificati della ca dpkg reconfigure per abilitarlo come certificato di sistema CA.Ubuntu: Copy cert to /usr/share/ca-certificates/ rename extension to .crt use dpkg-reconfigure ca-certificates to enable it as system CA certificate.
      • RHEL: certificato di copia al /etc/pki/ca-trust/source/anchors/ usare update-ca-trust per abilitarlo come certificato di sistema CA.RHEL: Copy cert to /etc/pki/ca-trust/source/anchors/ use update-ca-trust to enable it as system CA certificate.
      • SUSE: certificato di copia al /usr/share/pki/trust/anchors/ usare update-ca-certificates per abilitarlo come certificato di sistema CA.SUSE: Copy cert to /usr/share/pki/trust/anchors/ use update-ca-certificates to enable it as system CA certificate.
      • Windows: Importa il file con estensione PEM in un certificato in utente corrente -> attendibile l'autorità di certificazione radice -> certificatiWindows: Import the .pem file as a certificate under current user -> trusted root certification authorities -> certificates
      • macOS:macOS:
        • Copiare il certificato al /usr/local/etc/openssl/certsCopy the cert to /usr/local/etc/openssl/certs
        • Eseguire il comando seguente per ottenere il valore hash: /usr/local/Cellar/openssql/1.0.2l/openssql x509 -hash -in mssql.pem -nooutRun the following command to get the hash value: /usr/local/Cellar/openssql/1.0.2l/openssql x509 -hash -in mssql.pem -noout
        • Rinominare il certificato come valore.Rename the cert to value. Ad esempio: mv mssql.pem dc2dd900.0.For example: mv mssql.pem dc2dd900.0. Verificare che sia dc2dd900.0 in /usr/local/etc/openssl/certsMake sure dc2dd900.0 is in /usr/local/etc/openssl/certs
  • Esempi di stringhe di connessioneExample connection strings

    • SQL Server Management StudioSQL Server Management Studio
      Finestra di dialogo connessione SQL Server Management StudioSSMS connection dialog

    • SQLCMDSQLCMD

        sqlcmd  -S <sqlhostname> -N -U sa -P '<YourPassword>' 
      
    • ADO.NETADO.NET

        "Encrypt=True; TrustServerCertificate=False;" 
      
    • ODBCODBC

        "Encrypt=Yes; TrustServerCertificate=no;" 
      
    • JDBCJDBC

        "encrypt=true; trustServerCertificate=false;" 
      

Server ha avviato la crittografiaServer Initiated Encryption

  • Genera certificato (/CN deve corrispondere il nome di dominio completo di host di SQL Server)Generate certificate (/CN should match your SQL Server host fully-qualified domain name)

      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   
      sudo mv mssql.pem /etc/ssl/certs/ 
      sudo mv mssql.key /etc/ssl/private/ 
    
  • Configurare SQL ServerConfigure SQL Server

      systemctl stop mssql-server 
      cat /var/opt/mssql/mssql.conf 
      sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssqlfqdn.pem 
      sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssqlfqdn.key 
      sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2 
      sudo /opt/mssql/bin/mssql-conf set network.forceencryption 1 
    
  • Esempi di stringhe di connessioneExample connection strings

    • SQLCMDSQLCMD

        sqlcmd  -S <sqlhostname> -U sa -P '<YourPassword>' 
      
    • ADO.NETADO.NET

        "Encrypt=False; TrustServerCertificate=False;" 
      
    • ODBCODBC

        "Encrypt=no; TrustServerCertificate=no;"  
      
    • JDBCJDBC

        "encrypt=false; trustServerCertificate=false;" 
      

Nota

Impostare TrustServerCertificate su True se il client non è possibile connettersi all'autorità di certificazione per convalidare l'autenticità del certificatoSet TrustServerCertificate to True if the client cannot connect to CA to validate the authenticity of the cert

Errori comuni durante la connessioneCommon connection errors

Messaggio di erroreError message FixFix
La catena di certificati è stato emesso da un'autorità non attendibile.The certificate chain was issued by an authority that is not trusted. Questo errore si verifica quando i client sono in grado di verificare la firma sul certificato presentato da SQL Server durante l'handshake TLS.This error occurs when clients are unable to verify the signature on the certificate presented by SQL Server during the TLS handshake. Assicurarsi che il client considera attendibile uno il SQL ServerSQL Server certificato direttamente oppure l'autorità di certificazione che ha firmato il certificato di SQL Server.Make sure the client trusts either the SQL ServerSQL Server certificate directly, or the CA which signed the SQL Server certificate.
Il nome dell'entità di destinazione non è corretto.The target principal name is incorrect. Assicurarsi che il campo nome comune nel certificato del Server SQL corrisponde al nome di server specificato nella stringa di connessione del client.Make sure that Common Name field on SQL Server's certificate matches the server name specified in the client's connection string.
Una connessione esistente chiusa forzatamente dall'host remoto.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.This error can occur when the client doesn't support the TLS protocol version required by SQL Server. Ad esempio, se SQL ServerSQL Server è configurato per richiedere di TLS 1.2, assicurarsi che i client supportano anche il protocollo TLS 1.2.For example, if SQL ServerSQL Server is configured to require TLS 1.2, make sure your clients also support the TLS 1.2 protocol.