Szyfrowanie połączeń z programem SQL Server w systemie Linux
Dotyczy:programu SQL Server — Linux
Program SQL Server w systemie Linux może używać protokołu Transport Layer Security (TLS) do szyfrowania danych przesyłanych przez sieć między aplikacją kliencką a wystąpieniem programu SQL Server. Program SQL Server obsługuje te same protokoły TLS zarówno w systemach Windows, jak i Linux: TLS 1.2, 1.1 i 1.0. Jednak kroki konfigurowania protokołu TLS są specyficzne dla systemu operacyjnego, na którym działa program SQL Server.
Wymagania dotyczące certyfikatów
Upewnij się, że certyfikaty są zgodne z następującymi wymaganiami:
Bieżący czas systemowy musi znajdować się po właściwości
Valid from
certyfikatu i przed właściwościąValid to
certyfikatu.Certyfikat musi być przeznaczony do uwierzytelniania serwera. Wymaga to
Enhanced Key Usage
właściwości certyfikatu w celu określeniaServer Authentication (1.3.6.1.5.5.7.3.1)
.Certyfikat należy utworzyć przy użyciu opcji
KeySpec
AT_KEYEXCHANGE
. Zazwyczaj właściwość użycia klucza certyfikatu (KEY_USAGE
) obejmuje również szyfrowanie klucza (CERT_KEY_ENCIPHERMENT_KEY_USAGE
).Właściwość
Subject
certyfikatu musi wskazywać, że nazwa pospolita (CN) jest taka sama jak nazwa hosta lub w pełni kwalifikowana nazwa domeny (FQDN) komputera serwera.Notatka
Obsługiwane są certyfikaty typu wildcard.
Konfigurowanie bibliotek OpenSSL do użycia (opcjonalnie)
Linki symboliczne można utworzyć w katalogu /opt/mssql/lib/
, które odwołują się do tego, które libcrypto.so
i biblioteki libssl.so
powinny być używane do szyfrowania. Jest to przydatne, jeśli chcesz wymusić, aby program SQL Server używał określonej wersji biblioteki OpenSSL innej niż domyślna podana przez system. Jeśli te łącza symboliczne nie są obecne, program SQL Server ładuje domyślne skonfigurowane biblioteki OpenSSL w systemie.
Te linki symboliczne powinny mieć nazwę libcrypto.so
i libssl.so
i umieszczone w katalogu /opt/mssql/lib/
.
Notatka
Aby zapoznać się z przykładem użycia funkcji Let's Encrypt w celu wygenerowania certyfikatu, zobacz wpis w blogu Unlock the power of data in Azure with SQL Server on Linux Azure VMs and Azure AI search(Odblokowywanie możliwości danych na platformie Azure przy użyciu programu SQL Server na maszynach wirtualnych platformy Azure i wyszukiwania sztucznej inteligencji platformy Azure).
Przegląd
Protokół TLS służy do szyfrowania połączeń z aplikacji klienckiej do programu SQL Server. Po poprawnym skonfigurowaniu protokół TLS zapewnia zarówno prywatność, jak i integralność danych na potrzeby komunikacji między klientem a serwerem. Połączenia TLS mogą być inicjowane przez klienta lub inicjowane przez serwer.
W poniższej sekcji opisano konfigurowanie szyfrowania inicjowane przez klienta.
Generowanie certyfikatu
/CN
powinno być zgodne z w pełni kwalifikowaną nazwą domeny hosta programu SQL Server.
Ostrożność
W tym przykładzie użyto certyfikatu z podpisem własnym. Certyfikaty z podpisem własnym nie powinny być używane w scenariuszach produkcyjnych. Należy użyć certyfikatów CA.
Upewnij się, że foldery, w których są zapisywane certyfikaty i klucze prywatne, są dostępne dla użytkownika/grupy mssql
i mają uprawnienia ustawione na 700
(drwx-----
). Foldery można tworzyć ręcznie przy użyciu ustawienia uprawnień 700
(drwx------
) i należącego do użytkownika/grupy mssql
lub ustawić uprawnienie do 755
(drwxr-xr-x
), należące do innego użytkownika, ale nadal dostępne dla grupy użytkowników mssql
. Na przykład można utworzyć folder o nazwie sslcert
w ścieżce /var/opt/mssql/
, a następnie zapisać certyfikat i klucz prywatny z uprawnieniami do plików ustawionych na 600
, jak pokazano w poniższym przykładzie.
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
#Saving the certificate to the certs folder under /etc/ssl/ which has the following permission 755(drwxr-xr-x)
sudo mv mssql.pem /etc/ssl/certs/ drwxr-xr-x
#Saving the private key to the private folder under /etc/ssl/ with permissions set to 755(drwxr-xr-x)
sudo mv mssql.key /etc/ssl/private/
Konfigurowanie programu SQL Server
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
Rejestrowanie certyfikatu na komputerze klienckim (Windows, Linux lub macOS)
Jeśli używasz certyfikatu podpisanego przez urząd certyfikacji, musisz skopiować certyfikat urzędu certyfikacji zamiast certyfikatu użytkownika na komputer kliencki.
Jeśli używasz certyfikatu z podpisem własnym, skopiuj plik
.pem
do następujących folderów odpowiadających dystrybucji i wykonaj polecenia, aby je włączyć:Ubuntu: skopiuj certyfikat do
/usr/share/ca-certificates/
, zmień nazwę rozszerzenia na.crt
i użyjdpkg-reconfigure ca-certificates
, aby włączyć go jako certyfikat urzędu certyfikacji systemu.RHEL: skopiuj certyfikat do
/etc/pki/ca-trust/source/anchors/
i użyjupdate-ca-trust
, aby włączyć go jako certyfikat CA systemu.suse: skopiuj certyfikat do
/usr/share/pki/trust/anchors/
i użyjupdate-ca-certificates
, aby włączyć go jako certyfikat urzędu certyfikacji systemu.Windows: Zaimportuj plik
.pem
jako certyfikat w obszarze Bieżący użytkownik > Zaufane główne urzędy certyfikacji > Certyfikaty.macOS:
Skopiuj certyfikat do
/usr/local/etc/openssl/certs
Uruchom następujące polecenie w celu otrzymania wartości skrótu.
/usr/local/Cellar/openssl/1.0.2l/openssl x509 -hash -in mssql.pem -noout
Zmień nazwę certyfikatu na wartość . Na przykład:
mv mssql.pem dc2dd900.0
. Upewnij się, żedc2dd900.0
znajduje się w/usr/local/etc/openssl/certs
Przykładowe parametry połączenia
Ostrożność
Hasło powinno być zgodne z domyślnymi zasadami haseł programu SQL Server. Domyślnie hasło musi mieć długość co najmniej ośmiu znaków i zawierać znaki z trzech z następujących czterech zestawów: wielkie litery, małe litery, cyfry podstawowe-10 i symbole. Hasła mogą mieć długość maksymalnie 128 znaków. Używaj haseł, które są tak długie i złożone, jak to możliwe.
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;"
Typowe błędy połączeń
Komunikat o błędzie | Napraw |
---|---|
The certificate chain was issued by an authority that is not trusted. |
Ten błąd występuje, gdy klienci nie mogą zweryfikować podpisu certyfikatu przedstawionego przez program SQL Server podczas uzgadniania protokołu TLS. Upewnij się, że klient ufa bezpośrednio certyfikatowi programu SQL Server lub urzędowi certyfikacji, który podpisał certyfikat programu SQL Server. |
The target principal name is incorrect. |
Upewnij się, że pole Nazwa pospolita w certyfikacie programu SQL Server jest zgodne z nazwą serwera określoną w parametrach połączenia klienta. |
An existing connection was forcibly closed by the remote host. |
Ten błąd może wystąpić, gdy klient nie obsługuje wersji protokołu TLS wymaganej przez program SQL Server. Jeśli na przykład program SQL Server jest skonfigurowany do wymagania protokołu TLS 1.2, upewnij się, że klienci obsługują również protokół TLS 1.2. |
Ubuntu 20.04 i inne najnowsze wersje dystrybucji systemu Linux
objaw
Gdy wystąpienie programu SQL Server w systemie Linux ładuje certyfikat utworzony za pomocą algorytmu podpisu używającego mniej niż 112 bitów zabezpieczeń (na przykład: MD5, SHA-1), może wystąpić błąd połączenia, jak w tym przykładzie:
Połączenie zostało pomyślnie nawiązane z serwerem, ale wystąpił błąd podczas procesu logowania. (dostawca: Dostawca SSL, błąd: 0 — istniejące połączenie zostało siłą przerwane przez zdalnego hosta). (Microsoft SQL Server, błąd: 10054)
Błąd jest spowodowany domyślnie włączonym poziomem zabezpieczeń OpenSSL 2 w systemie Ubuntu 20.04 i nowszych wersjach. Poziom zabezpieczeń 2 uniemożliwia nawiązywanie połączeń TLS, które mają mniej niż 112 bitów zabezpieczeń.
Rozwiązanie
Zainstaluj certyfikat z algorytmem podpisu przy użyciu co najmniej 112 bitów zabezpieczeń. Algorytmy podpisów spełniające to wymaganie obejmują algorytmy SHA-224, SHA-256, SHA-384 i SHA-512.