Versleuteling en TLS met mssql-python

De mssql-python-driver ondersteunt versleutelde verbindingen via Transport Layer Security (TLS). Versleuteling beschermt data die tussen je applicatie en SQL Server wordt verzonden en voorkomt afluisteren en aanvallen in het midden.

Verbindingsversleuteling

Versleuteling inschakelen

Gebruik het Encrypt trefwoord om de versleuteling van de verbinding te regelen:

import mssql_python

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

Versleutel trefwoordwaarden

Waarde Beschrijving
yes Vereist encryptie en faalt als de server geen TLS ondersteunt.
no Het versleutelt de verbinding niet. Niet aanbevolen voor productie.
strict Gebruikt TDS 8.0 strikte encryptiemodus. Vereist SQL Server 2022 of hoger.

Important

Azure SQL Database vereist Encrypt=yes. Verbindingen zonder encryptie worden geweigerd.

Certificaatvalidatie

TrustServerCertificate

Bepaalt of de driver het TLS-certificaat van de server valideert:

# 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;"
)
Waarde Beschrijving
no Valideert het certificaat tegen vertrouwde CA's. Deze waarde is de standaard- en aanbevolen instelling.
yes Vertrouwt elk certificaat en slaat validatie over. Deze instelling is onveilig.

Waarschuwing

Instellen TrustServerCertificate=yes in productie stelt je applicatie bloot aan aanvallen van de tegenstander in het midden. Gebruik deze instelling alleen voor ontwikkeling met zelfondertekende certificaten.

TDS 8.0 strikte encryptie

SQL Server 2022 en later ondersteunen TDS 8.0 met strikte encryptiemodus:

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

Strict-modus biedt het hoogste beveiligingsniveau:

  • De chauffeur stelt TLS vast voordat er een TDS-handshake is.
  • Certificaatvalidatie is vereist en je kan geen gebruik maken van TrustServerCertificate=yes.
  • Deze modus biedt het hoogste niveau van bescherming tegen onderschepping.

HostnaamInCertificaat

Wanneer de certificaatnaam van de server niet overeenkomt met de naam van de verbindingsserver:

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

Dit trefwoord is nuttig wanneer:

  • Je applicatie maakt verbinding via een IP-adres in plaats van een hostnaam.
  • De server zit achter een load balancer.
  • Het certificaat gebruikt een andere subjectnaam dan de naam van de verbindingsserver.

Azure SQL Database

Azure SQL Database vereist encryptie:

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

On-premises SQL Server (productie)

Voor on-premises SQL Server met een door een CA ondertekend certificaat, behoud TrustServerCertificate=no zodat de driver de identiteit van de server verifieert:

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

Ontwikkeling met zelfondertekende certificaten

Tijdens de ontwikkeling met zelfondertekende certificaten, stel je TrustServerCertificate=yes in om certificaatvalidatie over te slaan:

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

SQL Server 2022 en latere versies met strikte modus

Gebruik Encrypt=strict voor TDS 8.0, waarbij de hele verbinding vanaf het begin in TLS wordt gewikkeld:

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

Probleemoplossingsproces

SSL-provider: validatie van certificaat mislukt

Het servercertificaat kon niet worden gevalideerd. Voer deze controles uit:

  • Controleer of het certificaat van een vertrouwde CA komt.
  • Controleer of de vervaldatum van het certificaat geldig is.
  • Controleer of de hostnaam van de server overeenkomt met het certificaat CN of SAN.
  • Gebruik TrustServerCertificate=yesvoor ontwikkeling.

"TCP-provider: Een bestaande verbinding werd met geweld gesloten"

De server kan encryptie vereisen, maar de client heeft het niet opgevraagd. Voer de volgende stappen uit:

  • Voeg toe Encrypt=yes aan je verbindingsreeks.
  • Controleer de SQL Server-configuratie voor de instelling Force Encryption.

"De certificaatketen is uitgegeven door een autoriteit die niet wordt vertrouwd"

De root-CA van het certificaat zit niet in de vertrouwde rootopslag van het systeem. Voer deze controles uit:

  • Installeer het CA-certificaat in de vertrouwde rootstore.
  • Voor Azure SQL moet je ervoor zorgen dat je systeem de CA-certificaten van Microsoft vertrouwt.
  • Gebruik TrustServerCertificate=yesvoor ontwikkeling.

Verbinding faalt met strikte encryptie

TDS 8.0 strict mode heeft de volgende vereisten:

  • De server moet SQL Server 2022 of later draaien.
  • De server moet een geldig en vertrouwd certificaat hebben.
  • Je kunt TrustServerCertificate=yes niet instellen.

Als de server TDS 8.0 niet ondersteunt, gebruik Encrypt=yes dan in plaats daarvan.