EF Core 7 -  Conexões SQL Server com Encrypt igual a true


 Neste artigo vou mostrar como a alteração do valor padrão da propriedade Encrypt, que agora é definida como true, pode afetar suas aplicações e como contornar o problema.

Com o .NET 7 houve muitas alterações, e, uma delas, esta relacionada com o pacote System.Data.SqlClient, e, pode afetar a sua aplicação se não for tratada de forma correta.

Qual era o comportamento anterior ao .NET 7 ?

As strings de conexão SqlClient usavam a propriedade Encrypt=False por padrão, e, isso permite conexões em máquinas de desenvolvimento onde o servidor local não possui um certificado válido.

Qual o novo comportamento ?

A partir do .NET 7 as strings de conexão SqlClient utilizam por padrão Encrypt=True e isso significa que :

  1. O servidor deve ser configurado com um certificado válido;
  2. O cliente deve confiar neste certificado;

Se essas condições não forem atendidas, será lançada um SqlException com a seguinte mensagem :
(provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.)

Assim, se você definir a string de conexão, conforme abaixo:

public class AppDbContext : DbContext
{
  
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
     optionsBuilder.UseSqlServer(
      
"Data Source=.;Initial Catalog=Demo;Integrated Security=True;");
   }
   ...
}

Pode obter uma SqlException relacionada com a segunraça.

Essa alteração foi feita para garantir que, por padrão, a conexão seja segura ou o aplicativo falhará ao se conectar.

Como resolver o problema

Existem três formas de proceder para resolver ou contornar o problema se ele surgir :

  1. Instale um certificado válido no servidor. Observe que este é um processo complicado e requer a obtenção de um certificado e a garantia de que ele seja assinado por uma autoridade confiável para o cliente;
     
  2. Se o servidor tiver um certificado, mas não for confiável para o cliente, então defina a propriedade TrustServerCertificate=True para ignorar os mecanismos normais de confiança;
     
  3. Adicione explicitamente Encrypt=False à string de conexão;

As opções 2 e 3 deixam o servidor em um estado inseguro e não deve ser usado em ambiente de produção.

Abaixo a string de conexão usando a propriedade TrustServerCertificate=True; :

public class AppDbContext : DbContext
{
  
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
     optionsBuilder.UseSqlServer(
      
"Data Source=.;Initial Catalog=Demo;Integrated Security=True;TrustServerCertificate=True;");
   }
   ...
}

A seguir a mesma string de conexão agora usando Encrypt=False; :

public class AppDbContext : DbContext
{
  
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
     optionsBuilder.UseSqlServer(
      
"Data Source=.;Initial Catalog=Demo;Integrated Security=True;Encrypt=False;");
   }
   ...
}

E estamos conversados...

"Vai alta a noite, e vem chegando o dia. Deixemos, pois, as obras das trevas e revistamo-nos das armas da luz.
Andemos dignamente, como em pleno dia, não em orgias e bebedices, não em impudicícias e dissoluções, não em contendas e ciúmes; mas revesti-vos do Senhor Jesus Cristo e nada disponhais para a carne no tocante às suas concupiscências."

Romanos 13:12-14

Referências:


José Carlos Macoratti