В ближайшем будущем мы внедряем зашифрованные соединения 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()
Почему 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-адресу), указанному в строке подключения. В противном случае попытка подключения не удастся.
Другими словами, единственный1 Проверка безопасности, которая выполняется с помощью комбинации «encrypt = true; trustservercertificate = false», заключается в том, чтобы увидеть, совпадает ли имя хоста сертификата с именем хоста сервера, к которому вы пытаетесь подключиться.
Я не удивлюсь, если использование просроченного сертификата сервера TLS также будет работать без сбоев.
1 Ну не совсем только чек, trustservercertificate=false
не принимает самозаверяющие сертификаты, поэтому сертификат должен быть подписан известным / доверенным центром сертификации