Verschlüsselung und TLS mit mssql-python

Der mssql-python-Treiber unterstützt verschlüsselte Verbindungen über Transport Layer Security (TLS). Die Verschlüsselung schützt Daten, die zwischen Ihrer Anwendung und dem SQL Server übertragen werden, und verhindert Abhör- und Gegner-in-der-Mitte-Angriffe.

Verbindungsverschlüsselung

Aktivieren der Verschlüsselung

Verwenden Sie das Encrypt Schlüsselwort zur Steuerung der Verbindungsverschlüsselung:

import mssql_python

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

Schlüsselwortwerte verschlüsseln

Wert Beschreibung
yes Erfordert Verschlüsselung und scheitert, wenn der Server kein TLS unterstützt.
no Verschlüsselt die Verbindung nicht. Nicht für die Produktion empfohlen.
strict Verwendet den TDS 8.0 strengen Verschlüsselungsmodus. Benötigt SQL Server 2022 oder neuer.

Important

Azure SQL-Datenbank benötigt Encrypt=yes. Verbindungen ohne Verschlüsselung werden abgelehnt.

Zertifikatüberprüfung

TrustServerCertificate

Kontrolliert, ob der Treiber das TLS-Zertifikat des Servers validiert:

# 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;"
)
Wert Beschreibung
no Validiert das Zertifikat gegen vertrauenswürdige CAs. Dieser Wert ist die Standard- und empfohlene Einstellung.
yes Vertraut jedem Zertifikat und überspringt die Validierung. Dieses Setting ist unsicher.

Caution

Die Einstellung TrustServerCertificate=yes im Produktivbetrieb macht Ihre Anwendung anfällig für Adversary-in-the-Middle-Angriffe. Verwenden Sie diese Einstellung nur für die Entwicklung mit selbstsignierten Zertifikaten.

TDS 8.0 strenge Verschlüsselung

SQL Server 2022 und später unterstützen TDS 8.0 mit strengem Verschlüsselungsmodus:

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

Der strenge Modus bietet das höchste Sicherheitsniveau:

  • Der Treiber stellt eine TLS-Verbindung her, bevor ein TDS-Handshake erfolgt.
  • Die Validierung des Zertifikats ist erforderlich, und Sie können TrustServerCertificate=yes nicht verwenden.
  • Dieser Modus bietet das höchste Maß an Schutz vor dem Abfangen.

HostNameInCertificate

Wenn der Zertifikatsname des Servers nicht mit dem Verbindungsservernamen übereinstimmt:

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

Dieses Schlüsselwort ist nützlich, wenn:

  • Ihre Anwendung verbindet sich über eine IP-Adresse statt über einen Hostnamen.
  • Der Server befindet sich hinter einem Load Balancer.
  • Das Zertifikat verwendet einen anderen Subjektnamen als der Name des Verbindungservers.

Azure SQL-Datenbank

Azure SQL-Datenbank erfordert Verschlüsselung:

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

On-premises SQL Server (Produktion)

Für lokale SQL Server-Instanzen mit einem CA-signierten Zertifikat behalten Sie TrustServerCertificate=no bei, damit der Treiber die Serveridentität überprüft:

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

Entwicklung mit selbstsignierten Zertifikaten

Legen Sie während der Entwicklung mit selbstsignierten Zertifikaten TrustServerCertificate=yes fest, um die Zertifikatsvalidierung zu überspringen:

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

SQL Server 2022 und spätere Versionen mit Strict-Mode

Verwendung Encrypt=strict für TDS 8.0, das die gesamte Verbindung von Anfang an in TLS umwickelt:

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

Problembehandlung

"SSL-Anbieter: Zertifikatsvalidierungsfehler"

Das Serverzertifikat konnte nicht validiert werden. Führen Sie diese Prüfungen durch:

  • Überprüfen Sie, ob das Zertifikat von einer vertrauenswürdigen CA stammt.
  • Überprüfen Sie, ob das Ablaufdatum des Zertifikats gültig ist.
  • Überprüfen Sie, ob der Server-Hostname mit dem Zertifikat CN oder SAN übereinstimmt.
  • Verwenden Sie TrustServerCertificate=yes für die Entwicklung.

"TCP-Anbieter: Eine bestehende Verbindung wurde gewaltsam geschlossen"

Der Server könnte eine Verschlüsselung verlangen, aber der Client hat sie nicht angefordert. Führen Sie die folgenden Schritte aus:

  • Füge Encrypt=yes deiner Verbindungszeichenfolge hinzu.
  • Überprüfe die SQL Server-Konfiguration für die Erzwing-Verschlüsselung-Einstellung.

"Die Zertifikatskette wurde von einer nicht vertrauenswürdigen Behörde ausgestellt"

Die Root-CA des Zertifikats befindet sich nicht im vertrauenswürdigen Root-Store des Systems. Führen Sie diese Prüfungen durch:

  • Installiere das CA-Zertifikat im vertrauenswürdigen Root-Store.
  • Für Azure SQL solltest du sicherstellen, dass dein System den CA-Zertifikaten von Microsoft vertraut.
  • Verwenden Sie TrustServerCertificate=yes für die Entwicklung.

Die Verbindung schlägt bei strikter Verschlüsselung fehl

Der strenge TDS-8.0-Modus hat folgende Anforderungen:

  • Der Server muss SQL Server 2022 oder später ausführen.
  • Der Server muss über ein gültiges, vertrauenswürdiges Zertifikat verfügen.
  • Du kannst nicht setzen TrustServerCertificate=yes.

Wenn der Server TDS 8.0 nicht unterstützt, nutze Encrypt=yes stattdessen.