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

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

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

Выберите версию 17 или версию 18

Драйвер 18 — это текущая основная версия. Драйвер 17 остаётся поддерживаемым, но приложениям, использующим его, всё ещё требуется последняя незначительная версия линейки Driver 17 для получения исправлений. Для даты поддержки и правил обслуживания см. Жизненный цикл поддержки.

Scenario Рекомендуемый путь
Новое применение Начните с драйвера 18. Настройте шифрование и проверку сертификатов перед производством.
Существующее приложение Driver 17 Установите драйвер 18 вместе с драйвером 17, измените имя драйвера в строка подключения или DSN и Encrypt установите его явно. Если проверка сертификата не проходит, исправьте серверный сертификат или хранилище доверия клиента.
Приложение, которому требуется Encrypt=Strict, HostnameInCertificate, RetryExec, или другое ключевое слово Драйвера 18 Используйте релиз Driver 18, который поддерживает эту настройку. Водитель 17 не принимает Strict значение и Encrypt не распознаёт новые ключевые слова.
Приложение, требующее закрепления сертификатного файла с помощью ServerCertificate Используйте драйвер 18.1 или более позднюю версию с Encrypt=Strict. Драйвер 17 не поддерживает эту настановку.

Смена основных версий обычно означает изменение выбранного вами имени драйвера или пакета:

Platform Пилот 17 Driver 18
Имя драйвера строки соединения ODBC Driver 17 for SQL Server ODBC Driver 18 for SQL Server
Название пакета Linux msodbcsql17 msodbcsql18

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

Строки по умолчанию и проверки описывают обычные удалённые соединения без настройки DSNEncrypt, атрибута SQL_COPT_SS_ENCRYPT или переопределения протокола Windows Force Encryption. LocalDB не является удалённой целью для TLS.

Area Версия 17 Версия 18 и более поздние версии
Настройка по умолчанию Encrypt no, если Authentication не установлено в значение, отличное от none или применение множества SQL_COPT_SS_ACCESS_TOKEN; тогда yes yes (18.0.1 и далее)
Encrypt Принятые значения yes, no yes, no, Mandatory, Optional, Strict
Режимы шифрования Без или включённых Выключенный, включённый или строгий
Проверка сертификата сервера С , валидирует Encrypt=yes;TrustServerCertificate=noсертификат. Только шифрование, требуемое сервером, не определяет валидацию. По умолчанию валидируется. В режимах без строгих пропускает TrustServerCertificate=yes обычную валидацию, включая случаи, когда серверу требуется шифрование.
Ключевые слова в строке подключения Базовый набор Базовый набор плюс новые ключевые слова

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

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

Драйвер 17 по умолчанию не Encrypt=no устанавливает значение, кроме Authentication того, что ключевое слово не назначено на значение, отличное none от приложения SQL_COPT_SS_ACCESS_TOKEN . Любой из них меняет значение по умолчанию на yes. Explicit Encrypt=no всё равно отключает шифрование. Драйвер 18.0.1 и более поздние по умолчанию — Encrypt=yes. Устанавливайте Encrypt это явно при сравнении версий.

Полное шифрование соединения защищает текст запроса и результаты, а также сам вход. С Encrypt=no, сервер всё ещё может требовать полное шифрование соединения. Когда и клиент, и сервер отключают шифрование, нестрогие переговоры используют шифрование только для входа; это не защищает данные последующих приложений.

При Encrypt=yes;TrustServerCertificate=no, оба драйвера выбирают обычную проверку сертификатов сервера. Если только серверу требуется полное шифрование соединения ( TrustServerCertificate=no по умолчанию), Драйвер 18 проверяет сертификат. В TrustServerCertificate=yes режиме вне строгого режима драйвер 18 пропускает эту валидацию. Драйвер 17 не проходит валидацию только из-за требования к серверу. Шифрование протокола Windows Force и внутренние пути обратного вызова для проверки сертификатов не учитываются в этом сравнении.

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

Оставляйте включёнными шифрование и проверку идентичности сервера:

  • Настройте действительный серверный сертификат и хранилище доверия клиента так, чтобы клиент доверял своему выдачу сертификата. Подключитесь с помощью имени, указанного в сертификате.
  • Если вы подключаетесь через псевдоним, установите HostnameInCertificate имя в сертификате сервера. Эта настройка не восстанавливает ненадёжную цепочку сертификатов.
  • Для Encrypt=Strict, драйвер 18.1 и более поздние версии также поддерживают ServerCertificate сопоставление серверного сертификата с файлом сертификата. Эта настройка закрепляет сертификат; оно не указывает имя хоста. Изучите его ограничения в ODBC DSN и ключевых словах строка подключения перед использованием.

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

Для изолированной тестовой среды запрос Encrypt=yes;TrustServerCertificate=yes на шифрование, но пропускает проверку идентичности сервера, оставляя соединение открытым для атак противника посередине. Не используйте это как ремонт производственного траста. В строгом режиме TrustServerCertificate игнорируется.

Если существующее приложение требует стандартное значение версии 17 во время контролируемого теста совместимости, см. Восстановить поведение шифрования версии 17. Encrypt=no и Encrypt=optional не восстанавливайте доверительные данные сертификатов, оставляя данные приложения незашифрованными.

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

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

Ценность Эквивалентно Behavior
Mandatory yes Соединение зашифровано.
Optional no Не требует полного шифрования соединения. Сервер всё ещё может потребовать его; шифрование только для входа не является защитой всей сессии.
Strict Нет Соединение использует шифрование TDS 8.0. Сервер должен поддерживать TDS 8.0, такие как SQL Server 2022 и более поздние версии.

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

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

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

Encrypt=no

Драйвер 18 также принимает Encrypt=optional для этой настройки. Ни одно из этих значений не мешает серверу требовать шифрования. Восстановить запланированную зашифрованную конфигурацию после теста; не использовать отключённое шифрование как средство для доверия сертификатов.

Контрольный список для обновления

  1. Инвентаризуйте строки соединения, DSN, ссылки на пакеты и скрипты развертывания, выбирающие драйвер 17.
  2. Установите драйвер 18 в тестовой среде, соответствующей продакшену.
  3. Измените ключевое Driver слово в каждой строка подключения на ODBC Driver 18 for SQL Server, а также обновите или создайте каждый DSN для использования драйвера 18. Установка Драйвера 18 не меняет существующие соединения, потому что соединения с именем Драйвер 17 продолжают использовать Драйвер 17.
  4. Задать Encrypt явно. Используйте Encrypt=Mandatory с обычной валидацией сертификатов. Используйте Encrypt=Strict только если сервер поддерживает TDS 8.0, например, SQL Server 2022 и более поздние версии. Для серверов, которые не поддерживают TDS 8.0, используйте Encrypt=Mandatory.
  5. Для обычной проверки подключитесь к TrustServerCertificate=no доверенной цепочке и принятому имени сервера и проверьте её. Для Driver 18.1 и более поздних версий с строгим закреплением файлов проверяйте точное совпадение сертификата и даты действительности; TrustServerCertificate игнорируется в строгом режиме.
  6. Запустите пути аутентификации, запроса, транзакции, массового копирования, отказа и повторной попытки.
  7. Проверьте диагностику ошибок проверки сертификатов перед тем, как рассматривать сбои как ошибки аутентификации или сети.
  8. Держите драйвер 17 установленным и ведите инвентарь с шага 1 до завершения валидации, чтобы можно было вернуться к версии 17.

Вернуться к версии 17

Драйверы 17 и 18 устанавливаются рядом, так что можно откатиться назад, не удаляя драйвер 18. Для информации о загрузке и установке см. раздел «Скачать драйвер ODBC для SQL Server».

  1. Убедитесь, что драйвер 17 всё ещё установлен на каждом клиенте.
  2. Используя инвентарь из чек-листа обновления, измените Driver ключевое слово в каждой строка подключения обратно на ODBC Driver 17 for SQL Server.
  3. Обновите или заново создайте каждый DSN для использования Драйвера 17.
  4. Отменить ссылки на пакеты и скрипты развертывания в пакет Driver 17, например msodbcsql17 , на Linux.
  5. Восстановите Encrypt значения и TrustServerCertificate значения, которые приложение использовало с Драйвером 17. Драйвер 17 принимает только yes и no для Encrypt и не распознаёт ключевые слова Драйвера 18, такие как HostnameInCertificate или ServerCertificate, поэтому удалите добавленные значения и ключевые слова для Драйвера 18. Измените ключевые слова псевдонимов обратно на имена Driver 17 и замените ConnectTimeout их вызовом SQLSetConnectAttr , который устанавливает SQL_ATTR_LOGIN_TIMEOUT. Для отображения см. ключевые слова New строка подключения.

Проверьте откат, прежде чем считать его полным:

  • Каждое соединение сообщает о драйвере 17. Вызовите SQLGetInfo с SQL_DRIVER_VER; основная версия — 17.
  • Пути аутентификации, запроса, транзакции, массового копирования, резервирования и повторной попытки в приложении проходят успешно.
  • Строки соединения и DSN не Encrypt содержат значений или ключевых слов, добавленных для драйвера 18.

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

Версия 18 добавляет следующие ключевые слова строка подключения, которые версия 17 не распознаёт. Некоторые из них — это новые названия настроек, которые версия 17 поддерживает под другим ключевым словом или атрибутом, указанным в эквивалентном столбце версии 17 .

Keyword Минимальная версия Purpose Эквивалент версии 17
ConcatNullYieldsNull 18.6 Определяет, приводит ли конкатенация нулевого значения к null. Нет
ConnectTimeout 18.7 Устанавливает тайм-аут входа за секунды. Если приложение также устанавливает SQL_ATTR_LOGIN_TIMEOUT, атрибут имеет приоритет. SQL_ATTR_LOGIN_TIMEOUT атрибут, set с SQLSetConnectAttr
FailoverPartner 18.7 Указывает резервного партнёра для зеркалирования базы данных. Только для Windows. Failover_Partner ключевое слово
GetDataExtensions 18,0 Управляет, какие SQLGetData расширения включают драйвер. Нет
HostnameInCertificate 18,0 Указывает имя хоста для проверки в TLS-сертификате сервера. Нет
IpAddressPreference 18.1 Указывает семейство IP-адресов, которое драйвер пробует первым. Нет
LongAsMax 18,0 Отображает длинные типы данных с их max эквивалентами. Нет
MultipleActiveResultSets 18.7 Включает несколько активных наборов результатов (MARS). Принимает Yes или No. MARS_Connection ключевое слово
RetryExec 18.1 Настраивает правила повтора для неудачных запросов. Нет
ServerCertificate 18.1 Задаёт файл сертификата для сопоставления с серверным сертификатом при использовании Encrypt=Strict. Нет
WorkstationID 18.7 Указывает имя рабочей станции, отправляемое на сервер. WSID ключевое слово

MultipleActiveResultSets, WorkstationID, и FailoverPartner являются псевдонимами, которые выравнивают имена ключевых слов ODBC с Microsoft.Data.SqlClient именами свойств. Версия 18 также принимает старые названия. Для подробностей см. Объединение ключевых слов строк соединения и ключевое слово ConnectTimeout.

Для полной ссылки на ключевые слова см. ключевые слова ODBC DSN и строка подключения.