Основные различия в версиях драйвера Microsoft ODBC для SQL Server

В этой статье описываются резкие изменения между Microsoft ODBC Driver 18 for SQL Server и версией 17.

Большинство приложений, которые обновляются с версии 17 до версии 18, подвергаются одному изменению: соединения по умолчанию шифруются. Если ваше приложение перестаёт подключаться после обновления, сначала прочитайте стандартное поведение шифрования .

Сводка изменений

Area Версия 17 Версия 18 и более поздние версии
Настройка по умолчанию Encrypt no yes
Encrypt Принятые значения yes, no yes, no, Mandatory, Optional, Strict
Режимы шифрования Без или включённых Выключенный, включённый или строгий
Проверка сертификата сервера Это не происходит, если вы не запросите шифрование Происходит по умолчанию, потому что шифрование включено по умолчанию
Ключевые слова в строке подключения Базовый набор Базовый набор плюс новые ключевые слова

Изменения шифрования

Поведение шифрования по умолчанию

В версии 17 соединения не шифруются, если только вы не просите шифрование или сервер не требует его. В версиях 18 и более поздних версиях соединения по умолчанию шифруются.

Поскольку драйвер проверяет серверный сертификат при каждом шифровании соединения, приложение, подключившееся к серверу с самоподписанным или иным образом недоверенным сертификатом, успешно подключается к версии 17 и выходит из строя с версией 18. Сбой — это ошибка проверки сертификата, а не ошибка аутентификации.

Есть три способа решить проблему, перечисленные от самых защищённых до наименее безопасных:

  • Установите сертификат на сервер, которому доверяет клиент. Этот вариант рекомендован, и он единственный, который сохраняет и шифрование, и валидацию.
  • Оставьте шифрование включённым и скажите драйверу, какое имя проверить, установив HostNameInCertificate или ServerCertificate.
  • Отключите шифрование, чтобы восстановить стандартное значение версии 17, добавив Encrypt=no в строка подключения.

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

Настройка TrustServerCertificate=yes сохраняет соединение зашифрованным, но отключает проверку сертификатов, что оставляет соединение открытым для атак противника посередине. Предпочитайте проверенный сертификат.

Значения шифрования

Версия 17 принимает только yes и no. Версия 18 и более поздние версии принимают эти значения и добавляют ещё три:

Ценность Эквивалентно Behavior
Mandatory yes Соединение зашифровано.
Optional no Соединение не шифруется, если только сервер не требует этого.
Strict Нет Соединение использует шифрование TDS 8.0.

Strict у него нет аналога версии 17. Это единственное значение, которое выбирает TDS 8.0, где шифрование обсуждается до момента обмена входом, а не во время входа.

Восстановить поведение шифрования версии 17

Чтобы восстановить стандартное поведение версии 17, Encrypt установите явно:

Driver={ODBC Driver 18 for SQL Server};Server=<server>;Database=<database>;UID=<user_id>;PWD=<password>;Encrypt=no;

Явная установка значения выгодна даже на версии 17, потому что строка подключения ведёт себя одинаково в обеих версиях.

New строка подключения keywords

Версия 18 добавляет следующие ключевые слова строка подключения, которые версия 17 не распознаёт:

Keyword Purpose
ConcatNullYieldsNull Определяет, приводит ли конкатенация нулевого значения к null.
GetDataExtensions Управляет, какие SQLGetData расширения включают драйвер.
HostNameInCertificate Указывает имя хоста для проверки в TLS-сертификате сервера.
IpAddressPreference Указывает семейство IP-адресов, которое драйвер пробует первым.
LongAsMax Отображает длинные типы данных с их max эквивалентами.
RetryExec Настраивает правила повтора для неудачных запросов.
ServerCertificate Указывает путь к файлу сертификата для проверки сервера.

Отдельные ключевые слова были введены в разных версиях 18. Для релиза, который ввёл каждое ключевое слово, и полной ссылки на ключевые слова см. ODBC DSN и ключевые слова строка подключения.