Szyfrowanie i TLS z mssql-python

Sterownik mssql-python obsługuje szyfrowane połączenia poprzez Transport Layer Security (TLS). Szyfrowanie chroni dane przesyłane między Twoją aplikacją a SQL Server oraz zapobiega podsłuchowi oraz atakom typu przeciwnik pośrodku.

Szyfrowanie połączeń

Włączanie szyfrowania

Użyj słowa kluczowego Encrypt do kontrolowania szyfrowania połączenia:

import mssql_python

# Require encryption (recommended)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
)

Szyfruj wartości słów kluczowych

Wartość Opis
yes Wymaga szyfrowania i zawodzi, jeśli serwer nie obsługuje TLS.
no Nie szyfruje połączenia. Niezalecane w środowisku produkcyjnym.
strict Używa trybu ścisłego szyfrowania TDS 8.0. Wymaga SQL Server 2022 lub nowszy.

Important

Azure SQL Database wymaga Encrypt=yes. Połączenia bez szyfrowania są odrzucane.

Walidacja certyfikatu

TrustServerCertificate

Kontroluje, czy sterownik waliduje certyfikat TLS serwera:

# Validate server certificate (recommended for production)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

# Skip certificate validation (development only)
conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)
Wartość Opis
no Weryfikuje certyfikat względem zaufanych CA. Ta wartość jest domyślnym i zalecanym ustawieniem.
yes Ufa każdemu certyfikatowi i pomija walidację. To ustawienie jest niebezpieczne.

Caution

Uruchomienie TrustServerCertificate=yes produkcji naraża aplikację na ataki przeciwnika pośrodku. Używaj tego ustawienia tylko do tworzenia z certyfikatami podpisanymi samodzielnie.

Ścisłe szyfrowanie TDS 8.0

SQL Server 2022 i późniejsze obsługują TDS 8.0 z trybem ścisłego szyfrowania:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=strict;"
)

Tryb ścisły zapewnia najwyższy poziom bezpieczeństwa:

  • Sterownik ustanawia protokół TLS przed jakimkolwiek uzgadnianiem połączenia TDS.
  • Wymagana jest walidacja certyfikatu i nie możesz użyć TrustServerCertificate=yes.
  • Ten tryb zapewnia najwyższy poziom ochrony przed przechwyceniem.

HostNameInCertificate

Gdy nazwa certyfikatu serwera nie zgadza się z nazwą serwera połączenia:

conn = mssql_python.connect(
    "Server=192.168.1.100;"  # IP address
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "HostNameInCertificate=<server>.contoso.com;"  # Certificate CN
)

To słowo kluczowe jest przydatne, gdy:

  • Twoja aplikacja łączy się przez adres IP zamiast nazwy hosta.
  • Serwer znajduje się za modułem równoważenia obciążenia.
  • Certyfikat używa innej nazwy podmiotu niż nazwa serwera połączenia.

Azure SQL Database

Azure SQL Database wymaga szyfrowania:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

Lokalny serwer SQL Server (produkcyjny)

Dla lokalnego SQL Server z certyfikatem podpisanym przez CA, zachowaj TrustServerCertificate=no tak, aby sterownik weryfikował tożsamość serwera:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

Rozwój z certyfikatami podpisanymi samodzielnie

Podczas tworzenia z certyfikatami podpisanymi samodzielnie, ustaw tak TrustServerCertificate=yes , aby pomijać walidację certyfikatów:

conn = mssql_python.connect(
    "Server=localhost;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)

SQL Server 2022 i późniejsze wersje z trybem ścisłym

Użyj Encrypt=strict dla TDS 8.0, który od samego początku obejmuje całe połączenie warstwą TLS:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Encrypt=strict;"
)

Troubleshooting

"Dostawca SSL: Niepowodzenie walidacji certyfikatu"

Certyfikatu serwera nie można było zweryfikować. Wykonaj następujące kontrole:

  • Sprawdź, czy certyfikat pochodzi od zaufanego CA.
  • Sprawdź, czy data ważności certyfikatu jest ważna.
  • Sprawdź, czy nazwa hosta serwera zgadza się z certyfikatem CN lub SAN.
  • W przypadku programowania użyj polecenia TrustServerCertificate=yes.

Dostawca TCP: Istniejące połączenie zostało zamknięte przymusowo

Serwer może wymagać szyfrowania, ale klient tego nie zażądał. Spróbuj wykonać następujące kroki:

  • Dodaj Encrypt=yes do ciągu połączenia.
  • Sprawdź konfigurację SQL Server dla ustawienia Force Encryption.

"Łańcuch certyfikatów został wydany przez organ, któremu nie ufano"

CA root certyfikatu nie znajduje się w zaufanym magazynie rootowym systemu. Wykonaj następujące kontrole:

  • Zainstaluj certyfikat CA w zaufanym magazynie root.
  • W przypadku Azure SQL upewnij się, że Twój system ufa certyfikatom CA Microsoft.
  • W przypadku programowania użyj polecenia TrustServerCertificate=yes.

Połączenie nie udaje się przy ścisłym szyfrowaniu

Tryb ścisły TDS 8.0 spełnia następujące wymagania:

  • Serwer musi działać na SQL Server 2022 lub nowszy.
  • Serwer musi posiadać ważny, zaufany certyfikat.
  • Nie da się ustawić TrustServerCertificate=yes.

Jeśli serwer nie obsługuje TDS 8.0, użyj Encrypt=yes zamiast tego.