Почему SQLclient по-прежнему разрешает зашифрованное соединение с аннулированным сертификатом?

Мы внедряем зашифрованные соединения SQL 2014 в ближайшем будущем. Я хочу провести комплексную проверку и подтвердить процесс подтверждения сертификата. Я также хочу использовать опцию trustservercertificate=false. Я хочу, чтобы все соединения действительно использовали проверку сертификата. Если сертификат сервера отозван, я хочу, чтобы соединение не установилось. Поэтому я реализовал сертификат на сервере SQL и отозвал его. если я использую certutil -verify, я подтверждаю отзыв. Тем не менее, даже с trustservercertificate=false, мое соединение sql все еще успешно.

Это мои полные параметры соединения SQL:

$cn = New-Object System.Data.SqlClient.SqlConnection
$cn.ConnectionString = "data source=fqdnservername;user=blah;password=blah;encrypt=true;trustservercertificate=false"
$cn.Open()

$cmd = $cn.CreateCommand()
$cmd.CommandText = "select sysdatetimeoffset()"
$dto = $cmd.ExecuteScalar()
Write-Output "Current SQL server time: $dto"
$cmd.Dispose()

$cn.Close()

1 ответ

Почему SQLclient по-прежнему разрешает зашифрованное соединение с аннулированным сертификатом?

Поскольку многие библиотеки TLS выполняют только минимальную проверку сертификатов сервера, либо по соображениям производительности, либо из-за того, что разработчики не видят необходимости внедрять более качественные проверки.

В этом конкретном случае .Net документация намекает на то, какие проверки выполняются:

Свойство SqlConnection.ConnectionString -> Encrypt
когда true SQL Server использует шифрование SSL для всех данных, передаваемых между клиентом и сервером, если на сервере установлен сертификат. Признанные значения true, false, yes, а также no, Для получения дополнительной информации см. Синтаксис строки подключения.
Начиная с.NET Framework 4.5, когда TrustServerCertificate является false а также Encrypt является true имя сервера (или IP-адрес) в SSL-сертификате SQL Server должно точно соответствовать имени сервера (или IP-адресу), указанному в строке подключения. В противном случае попытка подключения не удастся.

Другими словами, единственная проверка безопасности, которая выполняется с помощью комбинации "encrypt=true;trustservercertificate=false", заключается в проверке соответствия имени хоста сертификата имени хоста сервера, к которому вы пытаетесь подключиться.

Я не удивлюсь, если использование сертификата TLS-сервера с истекшим сроком действия также будет работать без сбоев.


+1 Ну не совсем единственная проверка, trustservercertificate=false не принимает самозаверяющие сертификаты, поэтому сертификат должен быть подписан известным / доверенным центром сертификации

Другие вопросы по тегам