Шифрование и сертификаты GO-MSSQLDB

go-mssqldb Драйвер поддерживает несколько режимов шифрования и стратегии проверки сертификатов для подключения к SQL Server и Azure SQL. В этой статье объясняется каждый режим шифрования, как настроить проверку сертификатов и когда использовать строгий режим TDS 8.0.

Выберите конфигурацию TLS

Используйте эту таблицу, чтобы выбрать наиболее безопасный вариант, подходящий для вашей среды, прежде чем настраивать отдельные параметры.

Сценарий Рекомендуемые параметры Почему
Azure SQL или SQL Server 2022 и более поздние версии, и вам нужна самая сильная защита по умолчанию encrypt=strict TDS 8.0 выполняет TLS-рукопожатие перед согласованием TDS и всегда проверяет сертификат.
Сертификаты сервера связаны с доверенным публичным или корпоративным CA encrypt=true Стандартная проверка сертификатов обычно достаточна, если имя хоста и цепочка доверия уже правильны.
Сервер использует частный удостоверяющий центр, который отсутствует в системном хранилище доверенных сертификатов encrypt=true&certificate=/path/to/ca-cert.pem Добавляет сертификат центра сертификации в пользовательский пул доверия и сохраняет стандартную проверку цепочки сертификатов.
Сервер использует самоподписанный сертификат, и вам нужна привязка сертификата encrypt=true&serverCertificate=/path/to/server.pem Сравнивает точный серверный сертификат байт за байт, вместо того чтобы полагаться на цепочку CA.
Только для локальной разработки или временных тестовых сред encrypt=true&TrustServerCertificate=true Оставляет шифрование включённым, но пропускает проверку идентичности сервера. Не используйте этот сеттинг в продакшене.

Режимы шифрования

Установить encrypt параметр соединения на одно из следующих значений:

Ценность Behavior
strict Шифрование TDS 8.0. Рукопожатие TLS происходит до согласования подключения TDS. Требуется SQL Server 2022 или Azure SQL.
true или mandatory Соединение шифруется после рукопожатия до входа в TDS.
false или optional Шифрование используется только в том случае, когда сервер этого требует. Это по умолчанию, когда encrypt не указано. Azure SQL всегда требует шифрования на стороне сервера, поэтому подключения к Azure SQL шифруются независимо от этой настройки.
disable Без шифрования. Не рекомендуется для эксплуатации.

Example

Включите шифрование в строка подключения, используя параметрencrypt:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true

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

Когда вы включаете шифрование (encrypt=true или encrypt=strict), драйвер проверяет сертификат сервера, если только вы не установите TrustServerCertificate=true. Существуют два независимых подхода для этой валидации.

Валидация цепочки с использованием certificate параметра

Предоставьте файл сертификатов PEM или DER. Драйвер добавляет сертификат в пользовательский пул доверия и выполняет стандартную проверку цепочки X.509 по этому пулу:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem

Сравнение на уровне байтов с использованием параметра serverCertificate

Note

Этот serverCertificate параметр был введён в драйвере версии 1.9.6.

Предоставьте файл PEM или DER, содержащий точный сертификат сервера. Драйвер сравнивает сертификат сервера байт за байт с предоставленным файлом. Драйвер не выполняет проверку цепочки. Этот подход полезен для самоподписанных сертификатов:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&serverCertificate=/path/to/server.pem

Переопределение имени хоста

По умолчанию драйвер проверяет, что общее имя (CN) или субъектное альтернативное имя (SAN) сертификата совпадает с именем хоста сервера. Используйте hostnameincertificate для переопределения ожидаемого имени хоста:

sqlserver://<user>:<password>@10.0.0.5:1433?database=AdventureWorks2025&encrypt=true&hostnameincertificate=<server>.domain.com

Пропустить проверку сертификата

Установите TrustServerCertificate=true, чтобы пропустить все проверки сертификатов. Соединение всё ещё зашифровано, но идентификация сервера не подтверждена:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=true

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

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

Строгий режим TDS 8.0

TDS 8.0 (строгое шифрование) выполняет TLS-рукопожатие перед любым согласованием протокола TDS. Такой подход не позволяет злоумышленнику полностью понизить уровень соединения. TDS 8.0 требует SQL Server 2022 или Azure SQL:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=strict

В строгом режиме параметр TrustServerCertificate игнорируется. Проверка сертификатов всегда происходит по умолчанию с использованием системного хранилища доверия. Вы можете указать certificate или serverCertificate для пользовательской проверки.

Минимальная версия TLS

Используйте параметр tlsmin для обеспечения минимальной версии TLS:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2

Допустимые значения: 1.0, , 1.11.21.3.

Сводка параметров шифрования

Parameter Default Description
encrypt false Режим шифрования. Azure SQL всегда требует шифрования на серверной стороне, независимо от этой настройки.
TrustServerCertificate Зависит от encrypt Пропускать проверку сертификата, если true. По умолчанию — false когда encrypt указано и true когда encrypt опущено.
certificate - Путь файла PEM/DER для проверки цепочек.
serverCertificate - Путь к файлу PEM/DER для сравнения на уровне байтов.
hostnameincertificate - Отменить ожидаемое имя хозяина в сертификате.
tlsmin - Минимальная версия TLS.