Kryptering och TLS med mssql-python

mssql-python-drivrutinen stödjer krypterade anslutningar via Transport Layer Security (TLS). Kryptering skyddar data som överförs mellan din applikation och SQL Server, och förhindrar avlyssning och attacker från angriparen i mitten.

Anslutningskryptering

Aktivera kryptering

Använd Encrypt nyckelordet för att styra anslutningskryptering:

import mssql_python

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

Kryptera nyckelordsvärden

Värde Beskrivning
yes Kräver kryptering och misslyckas om servern inte stödjer TLS.
no Den krypterar inte anslutningen. Rekommenderas inte för produktion.
strict Använder TDS 8.0 strikt krypteringsläge. Kräver SQL Server 2022 eller senare.

Important

Azure SQL Database kräver Encrypt=yes. Anslutningar utan kryptering avvisas.

Certifikatverifiering

LitaPåServercertifikat

Styr om drivrutinen validerar serverns TLS-certifikat:

# 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;"
)
Värde Beskrivning
no Validerar certifikatet mot betrodda CA:er. Detta värde är standard- och rekommenderad inställning.
yes Litar på vilket certifikat som helst och hoppar över validering. Denna miljö är osäker.

Caution

Inställning TrustServerCertificate=yes i produktion utsätter din applikation för attacker från motståndaren i mitten. Använd endast denna inställning för utveckling med självsignerade certifikat.

TDS 8.0 strikt kryptering

SQL Server 2022 och senare stöder TDS 8.0 med strikt krypteringsläge:

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

Strikt läge ger den högsta säkerhetsnivån:

  • Föraren etablerar TLS innan någon TDS-handskakning.
  • Certifikatvalidering krävs, och du kan inte använda TrustServerCertificate=yes.
  • Detta läge ger högsta skyddsnivå mot avlyssning.

HostNameInCertificate

När serverns certifikatnamn inte matchar anslutningsserverns namn:

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

Detta nyckelord är användbart när:

  • Din applikation ansluter via en IP-adress istället för ett värdnamn.
  • Servern ligger bakom en lastbalanserare.
  • Certifikatet använder ett annat ämnesnamn än anslutningsserverns namn.

Azure SQL Database

Azure SQL Database kräver kryptering:

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

Lokal SQL Server (produktion)

För lokal SQL Server med ett CA-signerat certifikat, håll TrustServerCertificate=no så att drivrutinen validerar serveridentiteten:

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

Utveckling med självsignerade certifikat

Under utveckling med självsignerade certifikat, ställ TrustServerCertificate=yes in att hoppa över certifikatvalidering:

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

SQL Server 2022 och senare versioner med strikt läge

Använd Encrypt=strict för TDS 8.0, som omsluter hela anslutningen i TLS från början:

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

Troubleshooting

"SSL-leverantör: Certifikatvalideringsfel"

Servercertifikatet kunde inte valideras. Gör dessa kontroller:

  • Verifiera att certifikatet kommer från en betrodd CA.
  • Kontrollera att certifikatets utgångsdatum är giltigt.
  • Verifiera att serverns värdnamn matchar certifikatet CN eller SAN.
  • För utveckling använder du TrustServerCertificate=yes.

"TCP-leverantör: En befintlig anslutning tvingades avslutas"

Servern kan kräva kryptering, men klienten begärde det inte. Prova följande steg:

  • Lägg till Encrypt=yes i din reťazec pripojenia.
  • Kontrollera SQL Server-konfigurationen för Force Encryption-inställningen.

"Certifikatkedjan utfärdades av en myndighet som inte är betrodd"

Certifikatets rot-CA finns inte i systemets betrodda rotlager. Gör dessa kontroller:

  • Installera CA-certifikatet i den betrodda rotbutiken.
  • För Azure SQL, se till att ditt system litar på Microsoft CA-certifikat.
  • För utveckling använder du TrustServerCertificate=yes.

Anslutningen misslyckas med strikt kryptering

TDS 8.0 strikt läge har följande krav:

  • Servern måste köra SQL Server 2022 eller senare.
  • Servern måste ha ett giltigt, betrodd certifikat.
  • Du kan inte ställa in TrustServerCertificate=yes.

Om servern inte stödjer TDS 8.0, använd Encrypt=yes istället.