Проверка шифрования и сертификата в Microsoft.Data.SqlClient

Скачать ADO.NET

Используйте Transport Layer Security (TLS) для шифрования трафика между вашим приложением и SQL Server. Оставьте включённой проверку сертификатов сервера для подтверждения личности сервера. Шифрование без подтверждения личности не защищает от противника посередине , который выдаёт себя за сервер.

Microsoft.Data.SqlClient по умолчанию использует Encrypt=Mandatory и TrustServerCertificate=false. Encrypt=true — синоним Mandatory. Для удалённого соединения явно запросите эти настройки и предоставите серверный сертификат, который клиент сможет проверить:

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;

Замените заполнятели и используйте метод аутентификации , поддерживаемый вашим сервером и приложением. Для Azure SQL или базы данных SQL в Microsoft Fabric см. аутентификацию Microsoft Entra.

Выберите режим шифрования

Encrypt Определяет, требуется ли клиенту шифрование. Сервер также может требовать шифрование. В этой таблице описано текущее поведение без закрепления сертификатов:

Настройка клиента Требование к серверу Проверка сертификата Результат
Encrypt=Optional или false Не требует шифрования. Нет, независимо от TrustServerCertificate. Шифруются только пакеты входа. Последующий трафик не шифруется.
Encrypt=Optional;TrustServerCertificate=false Форсирует шифрование. Цепочка доверия, валидность и имя сервера. Весь трафик зашифрован. Недействительные сертификаты приводят к ошибке соединения.
Encrypt=Optional;TrustServerCertificate=true Требует шифрования. Обойдён. Весь трафик зашифрован, но идентификация сервера не подтверждена.
Encrypt=Mandatory;TrustServerCertificate=false Любая из настроек. Цепочка доверия, валидность и имя сервера. Весь трафик зашифрован. Недействительные сертификаты приводят к сбою соединения.
Encrypt=Mandatory;TrustServerCertificate=true Любая из настроек. Обойдён. Весь трафик зашифрован, но идентификация сервера не подтверждена.
Encrypt=Strict Поддерживает протокол Tabular Data Stream (TDS) 8.0. Обязательно. TrustServerCertificate Это невозможно обойти. TLS запускается до передачи сообщений TDS. Неподдерживаемый сервер или недействительный сертификат приводит к сбою подключения.

Используйте Mandatory для зашифрованных соединений с серверами, которые не поддерживают TDS 8.0. Используйте Strict, если ваш конечный объект поддерживает TDS 8.0, включая SQL Server 2022 (16.x) и более поздние версии. TDS 8.0 поддерживает TLS 1.2 и TLS 1.3; TLS 1.3 не требуется. Согласованная версия TLS также зависит от конфигурации клиента, сервера и операционной системы.

Optional не является средством исправления ошибок в сертификатах. Он может оставлять данные приложения незашифрованными, если серверу не требуется шифрование.

Конфигурировать проверяемый серверный сертификат

Для обычной проверки сертификата:

  1. Предоставить сертификат, соответствующий требованиям сертификата SQL Server.
  2. Укажите имя, которое клиенты используют для подключения, в альтернативное имя предмета сертификата (SAN).
  3. Сделайте так, чтобы центр сертификации и все необходимые промежуточные сертификаты были доверенными на каждом клиентском хосте или контейнере.
  4. Настройте SQL Server для использования сертификата и оставьте TrustServerCertificate=false на клиентах.
  5. Запланируйте продление сертификата до истечения срока его действия, с учетом любых изменений в названиях или органах, выдавших сертификат.

Сертификат от публичного или корпоративного сертификационного органа может соответствовать этим требованиям. Корпоративный сертификат не доверяется автоматически внутри контейнера Linux или на отдельном компьютере разработчика.

Подключитесь через псевдоним

Если соединение использует псевдоним системы доменных имён (DNS), которого нет в сертификате, сначала рассмотрите возможность выдачи сертификата с этим псевдонимом. Или задайте в HostNameInCertificate имя, ожидаемое в сертификате:

Server=tcp:sql-alias.contoso.com,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=sql-server.contoso.com;MultiSubnetFailover=true;

HostNameInCertificate меняет имя, которое SqlClient ожидает во время проверки сертификатов. Он не меняет сетевой адрес и не обходит проверки доверительной цепочки и истечения срока действия. Оставляйте его неустановленным, если имя сервера уже совпадает с сертификатом.

Закрепите конкретный серверный сертификат

ServerCertificate предоставляет локальный файл сертификатов для точного сравнения с сертификатом сервера. Поддерживаемые форматы — Privacy-Enhanced Mail (PEM) и Distinguished Encoding Rules (DER), включая .cer файлы сертификатов. Используйте его с Encrypt=Mandatory или Encrypt=Strict, и сохраняйте TrustServerCertificate=false.

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=Strict;TrustServerCertificate=false;ServerCertificate=C:\certificates\sql-server.cer;MultiSubnetFailover=true;

Распределите ожидаемый сертификат через доверенный канал и защитите файл от замены. Точное совпадение сертификата — это альтернатива обычной проверке цепочки и имени, а не дополнительная проверка поверх неё. Байты сертификата должны совпадать; одного одного и того же имени субъекта или публичного ключа недостаточно. Отсутствующий, нечитаемый, некорректный или несовпадающий PIN-файл не проходит проверку.

Пиннинг связывает развертывание клиентов с ротацией сертификатов. Обновляйте PIN-код при изменении сертификата сервера, включая продление. Не получайте PIN-код, принимая неподтверждённый сертификат от сети.

SqlClient не предоставляет общедоступный обратный вызов для произвольной проверки сертификата TLS-сервера. AccessTokenCallback Контролирует получение токенов аутентификации, а не проверку TLS.

Сертификаты разработки и устранение неисправностей

Используйте доверенный сертификат разработки с правильным именем сервера. Если вы временно используете TrustServerCertificate=true с Encrypt=true в изолированной среде разработки, соединение зашифровано, но клиент не аутентифицирует серверный сертификат.

Внимание

Не развёртывайте TrustServerCertificate=true это как производственное исправление ошибок в сертификатах. Отключает проверку подлинности сервера с Mandatory и не действует при использовании Strict.

Failure Проверьте
Цепочка сертификатов не вызывает доверия. Установите на клиенте соответствующие доверенные корневые и промежуточные устройства. Проверьте, какой сертификат действительно предоставляет SQL Server.
Название сертификата не совпадает. Сравните Server с сертификатом SAN. Исправьте имя, сертификат или намеренное HostNameInCertificate переопределение.
Сертификат истёк. Продлите сертификат сервера и проверьте часы клиента.
Закреплённый сертификат не совпадает или не может быть загружен. Проверьте путь файла, права доступа, формат и развернутый сертификат. Обновите PIN-код через ваш проверенный процесс распространения.
Не удаётся установить соединение в режиме строгого шифрования. Убедитесь, что конечная точка поддерживает TDS 8.0 и что её конфигурация TLS совместима с клиентом.

Для конфигурации на стороне сервера см. обзор сертификатов.

Изменения в поведении проверки шифрования и сертификата

Эти заметки совместимости объясняют изменения поведения при обновлении старых приложений. Новые приложения должны использовать текущие настройки, описанные в этой статье.

Выпуск драйверов Изменение
1.0 Encrypt=false — значение по умолчанию. Когда клиент не запрашивает шифрование, серверное принудительное шифрование не запускает валидацию сертификата.
2.0 Серверное принудительное шифрование уважает TrustServerCertificate даже тогда, когда Encrypt=false.
4.0 Шифрование становится включено по умолчанию. Обновления могут выявить ранее не замеченные ошибки настройки сертификатов.
5.0 Добавляет Optional, Mandatory, Strict, и HostNameInCertificate.
5.1 Добавляет ServerCertificate для закрепления сертификатов.
7.0.3 Исправлена проверка закрепления сертификата в управляемой сети: теперь она завершается отказом при отсутствии, недействительности или несовпадении файлов, даже если обычная проверка платформы выполняется успешно.