Atualizei uma biblioteca do .NET 4.7 para o .NET 8.0.
Ao fazer isso, tive que atualizar minhas System.Data.SqlClient
referências para Microsoft.Data.SqlClient
.
Tenho os dois projetos abertos, em diferentes sessões do VS, lado a lado.
Ambos estão passando exatamente a mesma string de conexão para o Open
método em suas respectivas versões de SqlConnection
:
Data Source=MyDbServer;Initial Catalog=MyDatabase;Application Name=MyApplication;Pooling='true';Connection Lifetime=500;Integrated Security=SSPI;Persist Security Info=True;
A System.Data.SqlClient
versão de SqlConnection
abre sem problemas.
A Microsoft.Data.SqlClient
versão de SqlConnection
levanta esta exceção em Open()
:
Uma conexão foi estabelecida com sucesso com o servidor, mas ocorreu um erro durante o processo de login. (provedor: Provedor SSL, erro: 0 - A cadeia de certificados foi emitida por uma autoridade não confiável.)'
Duas perguntas:
Por que a
System.*
versão dá certo e aMicrosoft.*
versão não?O que preciso mudar na minha string de conexão para que isso funcione? (por exemplo, não quero mudar nada no servidor do banco de dados ou no próprio banco de dados para que isso funcione... só quero mudar a string de conexão)
Obrigado
Para a questão 1,
Microsoft.Data.SqlClient impõe padrões de segurança mais rigorosos em comparação ao System.Data.SqlClient.
System.Data.SqlClient ignora silenciosamente alguns cenários de validação SSL/TLS, enquanto Microsoft.Data.SqlClient requer certificados confiáveis por padrão e, se o seu SQL Server estiver usando um certificado interno ou autoassinado que não é confiável para sua máquina cliente, ele gera exatamente esse erro.
Para a pergunta 2, adicione TrustServerCertificate=true; na sua string de conexão.
Há um bom guia sobre como migrar de System.Data.SqlClient para Microsoft.Data.SqlClient
aqui que espero que explique a mudança:
https://github.com/dotnet/SqlClient/blob/main/porting-cheat-sheet.md#functionality-changes
A parte relevante está abaixo:

A versão anterior era mais tolerante com a segurança, enquanto a versão mais recente é mais rigorosa. Portanto, a resposta pode ser encontrada na documentação desta última. Na seção sobre segurança aprimorada do TDS 8, podemos ver o seguinte:
A seção Valor padrão do Encrypt definido como verdadeiro explica que isso
Encrypt
é verdadeiro por padrão:Resumidamente:
TrustServerCertificate
desabilita o strict more e confia no certificado do servidor, ignorando assim a medida de segurança