Шифрование соединений с SQL Server на LinuxEncrypting Connections to SQL Server on Linux

Область применения:  ДаSQL Server (только в Linux) НетБаза данных SQL Azure НетХранилище данных SQL AzureНетParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server на Linux может использовать протокол TLS для шифрования данных, передаваемых по сети между клиентским приложением и экземпляром 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 поддерживает одни и те же протоколы TLS в Windows и Linux: TLS 1.2, 1.1 и 1.0.supports the same TLS protocols on both Windows and Linux: TLS 1.2, 1.1, and 1.0. Однако действия по настройке TLS зависят от конкретной операционной системы, где выполняется SQL ServerSQL Server.However, the steps to configure TLS are specific to the operating system on which SQL ServerSQL Server is running.

Требования к сертификатамRequirements for Certificates

Прежде чем приступить к работе, нужно убедиться, что сертификаты соответствуют следующим требованиям.Before getting started, you need to make sure your certificates follow these requirements:

  • Текущее системное время должно превышать значение свойства сертификата "Действителен с" и не превышать значение свойства "Действителен до".The current system time must be after the Valid from property of the certificate and before the Valid to property of the certificate.
  • Сертификат должен быть предназначен для проверки подлинности сервера.The certificate must be meant for server authentication. Для этого требуется задать свойству сертификата "Улучшенный ключ" значение "Проверка подлинности сервера (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).
  • Сертификат должен быть создан с помощью параметра KeySpec свойства AT_KEYEXCHANGE.The certificate must be created by using the KeySpec option of AT_KEYEXCHANGE. Обычно в свойстве применения ключа сертификата (KEY_USAGE) также предусмотрено шифрование ключа (CERT_KEY_ENCIPHERMENT_KEY_USAGE).Usually, the certificate's key usage property (KEY_USAGE) also includes key encipherment (CERT_KEY_ENCIPHERMENT_KEY_USAGE).
  • Свойство "Субъект" сертификата должно указывать, что общее имя (CN) совпадает с именем узла или полным доменным именем (FQDN) сервера.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. Примечание. Поддерживаются групповые сертификаты.Note: Wild Card Certificates are supported.

Настройка библиотек OpenSSL для использования (необязательно)Configuring the OpenSSL Libraries for Use (Optional)

В /opt/mssql/lib/ каталоге можно создать символьные ссылки, указывающие, какие библиотеки libcrypto.so и libssl.so следует использовать для шифрования.You can create symbolic links in the /opt/mssql/lib/ directory that reference which libcrypto.so and libssl.so libraries should be used for encryption. Это удобно, если нужно заставить SQL Server использовать определенную версию OpenSSL, отличную от предоставленной системой для использования по умолчанию.This is useful if you want to force SQL Server to use a specific version of OpenSSL other than the default provided by the system. Если эти символьные ссылки отсутствуют, SQL Server загрузит настроенные в системе библиотеки OpenSSL по умолчанию.If these symbolic links are not present, SQL Server will load the default configured OpenSSL libraries on the system.

Эти символьные ссылки должны называться libcrypto.so и libssl.so и находиться в каталоге /opt/mssql/lib/.These symbolic links should be named libcrypto.so and libssl.so and placed in the /opt/mssql/lib/ directory.

ОбзорOverview

Протокол TLS используется для шифрования подключений от клиентского приложения к SQL ServerSQL Server.TLS is used to encrypt connections from a client application to SQL ServerSQL Server. При правильной настройке TLS обеспечивает как конфиденциальность, так и целостность данных при взаимодействии клиента и сервера.When configured correctly, TLS provides both privacy and data integrity for communications between the client and the server. Подключения TLS могут инициироваться клиентом или сервером.TLS connections can either be client initiated or server initiated.

Шифрование, инициированное клиентомClient Initiated Encryption

  • Создание сертификата (значение /CN должно соответствовать полному доменному имени вашего узла SQL Server)Generate certificate (/CN should match your SQL Server host fully qualified domain name)

Примечание

В этом примере используется самозаверяющий сертификат, который не следует использовать в рабочих сценариях.For this example we use a Self-Signed Certificate, this should not be used for production scenarios. Нужно использовать сертификаты ЦС.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/ 
  • Настройка 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/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 
    
  • Регистрация сертификата на клиентском компьютере (Windows, Linux или macOS)Register the certificate on your client machine (Windows, Linux, or macOS)

    • Если вы используете сертификат, подписанный центром сертификации, на клиентский компьютер нужно скопировать сертификат центра сертификации (ЦС), а не сертификат пользователя.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.
    • Если вы используете самозаверяющий сертификат, просто скопируйте PEM-файл в следующие папки, соответствующие используемому дистрибутиву, и выполните команды, чтобы включить их.If 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: скопируйте сертификат в /usr/share/ca-certificates/, переименуйте расширение на .crt и используйте dpkg-reconfigure ca-certificates, чтобы включить его в качестве системного сертификата ЦС.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: скопируйте сертификат в /etc/pki/ca-trust/source/anchors/, используйте update-ca-trust, чтобы включить его в качестве системного сертификата ЦС.RHEL: Copy cert to /etc/pki/ca-trust/source/anchors/ use update-ca-trust to enable it as system CA certificate.
      • SUSE: скопируйте сертификат в /usr/share/pki/trust/anchors/, используйте update-ca-certificates, чтобы включить его в качестве системного сертификата ЦС.SUSE: Copy cert to /usr/share/pki/trust/anchors/ use update-ca-certificates to enable it as system CA certificate.
      • Windows: импортируйте PEM-файл в качестве сертификата в раздел "Текущий пользователь" -> "Доверенные корневые центры сертификации" -> "Сертификаты".Windows: Import the .pem file as a certificate under current user -> trusted root certification authorities -> certificates
      • macOS:macOS:
        • скопируйте сертификат в /usr/local/etc/openssl/certs.Copy the cert to /usr/local/etc/openssl/certs
        • Выполните следующую команду, чтобы получить хэш-значение: /usr/local/Cellar/openssql/1.0.2l/openssql x509 -hash -in mssql.pem -noout.Run the following command to get the hash value: /usr/local/Cellar/openssql/1.0.2l/openssql x509 -hash -in mssql.pem -noout
        • Переименуйте сертификат в value.Rename the cert to value. Например: mv mssql.pem dc2dd900.0.For example: mv mssql.pem dc2dd900.0. Убедитесь, что dc2dd900.0 указано в /usr/local/etc/openssl/certs.Make sure dc2dd900.0 is in /usr/local/etc/openssl/certs
  • Примеры строк подключенияExample connection strings

    • SQL Server Management StudioSQL Server Management Studio
      Диалоговое окно подключения SSMSSSMS 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 Initiated Encryption

  • Создание сертификата (значение /CN должно соответствовать полному доменному имени вашего узла 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/ 
    
  • Настройка 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/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 1 
    
  • Примеры строк подключенияExample 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;" 
      

Примечание

Задайте для TrustServerCertificate значение true, если клиенту не удается подключиться к ЦС для проверки подлинности сертификата.Set TrustServerCertificate to True if the client cannot connect to CA to validate the authenticity of the cert

Распространенные ошибки при подключенииCommon connection errors

Сообщение об ошибкеError message FixFix
Цепочка сертификатов не была выпущена доверенным центром сертификации.The certificate chain was issued by an authority that is not trusted. Эта ошибка возникает, когда клиенты не могут проверить подпись сертификата, представленного SQL Server во время подтверждения TLS.This error occurs when clients are unable to verify the signature on the certificate presented by SQL Server during the TLS handshake. Убедитесь, что клиент доверяет напрямую сертификату SQL ServerSQL Server или доверяет ЦС, подписавшему этот сертификат SQL Server.Make sure the client trusts either the SQL ServerSQL Server certificate directly, or the CA which signed the SQL Server certificate.
Неправильное имя целевого субъекта.The target principal name is incorrect. Убедитесь, что значение в поле общего имени в сертификате SQL Server соответствует имени сервера, указанному в строке подключения клиента.Make sure that Common Name field on SQL Server's certificate matches the server name specified in the client's connection string.
существующее соединение было принудительно завершено удаленным узлом.An existing connection was forcibly closed by the remote host. Эта ошибка может возникать, если клиент не поддерживает версию протокола TLS, необходимую SQL Server.This error can occur when the client doesn't support the TLS protocol version required by SQL Server. Например, если параметр SQL ServerSQL Server настроен для использования TLS 1.2, убедитесь, что клиенты также поддерживают протокол 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.