Шифрование и TLS с помощью mssql-python

Драйвер mssql-python поддерживает зашифрованные соединения через безопасность транспортного уровня (TLS). Шифрование защищает данные при передаче между вашим приложением и SQL Server, а также предотвращает подслушивание и атаки противника посередине.

Шифрование подключения

Включение шифрования

Используйте ключевое Encrypt слово для управления шифрованием соединения:

import mssql_python

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

Зашифровать значения ключевых слов

Ценность Описание
yes Требуется шифрование и не работает, если сервер не поддерживает TLS.
no Не шифрует соединение. Не рекомендуется для эксплуатации.
strict Использует режим строгого шифрования TDS 8.0. Требуется SQL Server 2022 или новее.

Important

База данных SQL Azure требует Encrypt=yes. Соединения без шифрования отклоняются.

Проверка сертификата

TrustServerCertificate

Контролирует, проверяет ли драйвер сертификат TLS сервера:

# 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;"
)
Ценность Описание
no Проверяет сертификат относительно доверенных центров сертификации. Это значение — стандартная и рекомендуемая настройка.
yes Доверяет любому сертификату и пропускает валидацию. Эта обстановка ненадёжна.

Предостережение

Использование параметра TrustServerCertificate=yes в рабочей среде делает ваше приложение уязвимым для атак типа «злоумышленник посередине». Используйте эту настройку только для разработки с самоподписанными сертификатами.

Строгое шифрование TDS 8.0

SQL Server 2022 и более поздние версии поддерживают TDS 8.0 с строгим режимом шифрования:

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

Строгий режим обеспечивает самый высокий уровень безопасности:

  • Водитель устанавливает TLS до любого рукопожатия TDS.
  • Требуется валидация сертификата, и вы не можете использовать TrustServerCertificate=yes.
  • Этот режим обеспечивает высочайший уровень защиты от перехвата.

HostNameInCertificate

Когда имя сертификата сервера не совпадает с именем сервера подключения:

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

Это ключевое слово полезно, когда:

  • Ваше приложение подключается через IP-адрес, а не через имя хоста.
  • Сервер находится за балансировщиком нагрузки.
  • Сертификат использует другое имя субъекта, отличное от имени сервера соединения.

База данных SQL Azure

База данных SQL Azure требует шифрования:

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

Локальный SQL Server (производство)

Для локального SQL Server с сертификатом, подписанным CA, оставите TrustServerCertificate=no так, чтобы драйвер проверял идентификатор сервера:

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

Разработка с самоподписанными сертификатами

Во время разработки с самоподписанными сертификатами установите TrustServerCertificate=yes так, чтобы пропускать проверку сертификатов:

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

SQL Server 2022 и более поздние версии с строгим режимом

Для TDS 8.0 используйте Encrypt=strict, который с самого начала шифрует всё подключение с помощью TLS:

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

Troubleshooting

"SSL-провайдер: неудача в проверке сертификатов"

Сертификат сервера не удалось проверить. Проведите следующие проверки:

  • Проверьте, что сертификат принадлежит доверенному CA.
  • Проверьте, действительна ли дата истечения сертификата.
  • Проверьте, соответствует ли имя хоста сервера сертификату CN или SAN.
  • Для разработки используйте TrustServerCertificate=yes.

«TCP-провайдер: существующее соединение было насильно закрыто»

Серверу может потребоваться шифрование, но клиент его не запрашивал. Попробуйте выполнить следующие действия.

  • Добавьте Encrypt=yes в свою строка подключения.
  • Проверьте конфигурацию SQL Server для настройки Force Encryption.

«Цепочка сертификатов была выдана органом, которому не доверяют»

Корневой CA сертификата отсутствует в доверенном корневом хранилище системы. Проведите следующие проверки:

  • Установите сертификат CA в доверенном корневом хранилище.
  • Для Azure SQL убедитесь, что ваша система доверяет сертификатам Microsoft CA.
  • Для разработки используйте TrustServerCertificate=yes.

Соединение не работает при строгом шифровании

Строгий режим TDS 8.0 имеет следующие требования:

  • Сервер должен запускать SQL Server 2022 или новее.
  • Сервер должен иметь действительный, доверенный сертификат.
  • Ты не можешь устанавливать TrustServerCertificate=yes.

Если сервер не поддерживает TDS 8.0, используйте Encrypt=yes вместо него.