Šifrování a TLS s mssql-python

Ovladač mssql-python podporuje šifrovaná spojení prostřednictvím Transport Layer Security (TLS). Šifrování chrání data při přenosu mezi vaší aplikací a SQL Server a zabraňuje odposlechu a útokům typu "útočník uprostřed systému".

Šifrování připojení

Povolení šifrování

Použijte klíčové slovo Encrypt k ovládání šifrování spojení:

import mssql_python

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

Šifrujte hodnoty klíčových slov

Hodnota Popis
yes Vyžaduje šifrování a selže, pokud server TLS nepodporuje.
no Nešifruje to spojení. Nedoporučuje se pro produkční prostředí.
strict Používá režim TDS 8.0 s přísným šifrováním. Vyžaduje SQL Server 2022 nebo novější.

Important

Azure SQL Database vyžaduje Encrypt=yes. Připojení bez šifrování jsou odmítána.

Ověření certifikátu

TrustServerCertificate

Ovládá, zda ovladač ověřuje TLS certifikát serveru:

# 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;"
)
Hodnota Popis
no Ověřuje certifikát vůči důvěryhodným CA. Tato hodnota je výchozí a doporučené nastavení.
yes Důvěřuje jakémukoliv certifikátu a vynechá validaci. Toto nastavení je nejisté.

Caution

Spuštění TrustServerCertificate=yes do produkce vystavuje vaši aplikaci útokům protivníka uprostřed (adversary-in-the-middle). Toto nastavení používejte pouze pro vývoj s certifikáty podepsanými vlastními uživateli.

TDS 8.0 přísné šifrování

SQL Server 2022 a novější podporují TDS 8.0 s přísným režimem šifrování:

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

Přísný režim poskytuje nejvyšší úroveň bezpečnosti:

  • Ovladač nastaví TLS před jakýmkoli TDS handshakem.
  • Je vyžadováno ověření certifikátu a nelze použít TrustServerCertificate=yes.
  • Tento režim poskytuje nejvyšší úroveň ochrany proti zachycení.

HostNameInCertificate

Když název certifikátu serveru neodpovídá názvu serveru připojení:

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

Toto klíčové slovo je užitečné, když:

  • Vaše aplikace se připojuje přes IP adresu místo názvu hostitele.
  • Server je za vyrovnávačem zátěže.
  • Certifikát používá jiný název subjektu než název serveru spojení.

Azure SQL Database

Azure SQL Database vyžaduje šifrování:

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

Místní SQL Server (produkční)

Pro on-premises SQL Server s certifikátem podepsaným CA udržujte TrustServerCertificate=no tak, aby ovladač ověřoval identitu serveru:

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

Vývoj se samopodepsanými certifikáty

Během vývoje s certifikáty podepsanými sami sebou nastavte TrustServerCertificate=yes vynechání validace certifikátu:

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

SQL Server 2022 a pozdější verze s přísným režimem

Použijte Encrypt=strict pro TDS 8.0, který od samého začátku zajišťuje šifrování celého připojení pomocí TLS:

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

Řešení problémů

"SSL poskytovatel: Selhání ověření certifikátu"

Certifikát serveru nešlo ověřit. Proveďte tyto kontroly:

  • Ověřte, že certifikát pochází z důvěryhodné CA.
  • Zkontrolujte, zda je datum expirace certifikátu platné.
  • Ověřte, že serverové hostitelské jméno odpovídá certifikátu CN nebo SAN.
  • Pro vývoj použijte TrustServerCertificate=yes.

"TCP Provider: Existující spojení bylo násilně uzavřeno"

Server může vyžadovat šifrování, ale klient o něj nežádal. Vyzkoušejte tento postup:

  • Přidejte Encrypt=yes do svého připojovací řetězec.
  • Zkontrolujte konfiguraci SQL Server pro nastavení Force Encryption.

"Řetězec certifikátů byl vydán autoritou, které není důvěryhodné"

Kořenová CA certifikátu není v důvěryhodném kořenovém úložišti systému. Proveďte tyto kontroly:

  • Nainstalujte CA certifikát do důvěryhodného kořenového úložiště.
  • U Azure SQL se ujistěte, že váš systém důvěřuje CA certifikátům Microsoft.
  • Pro vývoj použijte TrustServerCertificate=yes.

Spojení selže při přísném šifrování

Přísný režim TDS 8.0 má tyto požadavky:

  • Server musí běžet na SQL Server 2022 nebo novějším.
  • Server musí mít platný, důvěryhodný certifikát.
  • Nemůžeš nastavit TrustServerCertificate=yes.

Pokud server nepodporuje TDS 8.0, použijte Encrypt=yes místo toho.