Por que o SQLclient ainda permite conexão criptografada com o certificado revogado?

1

Estamos implementando conexões criptografadas do SQL 2014 em um futuro próximo. Eu quero fazer minha devida diligência e confirmar o processo de validação do certificado. Eu também quero usar a opção trustservercertificate = false. Eu quero que todas as conexões usem realmente a validação do cert. Se um certificado do servidor for revogado, quero que a conexão falhe. Então, eu implementei um certificado no servidor SQL e o revoguei. se eu usar o certutil-verify, confirmo a revogação. No entanto, mesmo com trustservercertificate = false, minha conexão SQL ainda é bem-sucedida.

Estes são os parâmetros completos da minha conexão 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()
    
por MattRDude 04.01.2017 / 16:50

1 resposta

1

Why does SQLclient still allow an encrypted connection with a revoked cert?

Como muitas bibliotecas TLS fazem apenas uma verificação mínima dos certificados do servidor, seja por motivos de desempenho ou porque os desenvolvedores não veem a necessidade de implementar verificações melhores.

Nesse caso específico, o. Documentação de rede sugere quais verificações são realizadas:

SqlConnection.ConnectionString Property --> Encrypt
When true, SQL Server uses SSL encryption for all data sent between the client and server if the server has a certificate installed. Recognised values are true, false, yes, and no. For more information, see Connection String Syntax.
Beginning in .NET Framework 4.5, when TrustServerCertificate is false and Encrypt is true, the server name (or IP address) in a SQL Server SSL certificate must exactly match the server name (or IP address) specified in the connection string. Otherwise, the connection attempt will fail.

Em outras palavras, a única verificação de segurança 1 que está sendo feita com a combinação de "encrypt = true; trustservercertificate = false" é ver se o nome do host do certificado corresponde ao nome do host do servidor tentando se conectar.

Não ficaria surpreso se usar um certificado de servidor TLS expirado também funcionasse sem falhas.

1 Bem, não exatamente a verificação , trustservercertificate=false não aceitará certificados autoassinados para que o certificado ainda seja assinado por uma CA conhecida / confiável

    
por 04.01.2017 / 17:26