Почему 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
не принимает самозаверяющие сертификаты, поэтому сертификат должен быть подписан известным / доверенным центром сертификации