突然 - 工作项目中“证书链是由 Microsoft.Data.SqlClient 中不受信任的机构颁发的”

Gaz*_*z83 28 c# sql-server

我有一个在 Windows Server 上的 IIS 中运行的 ASP.Net Webforms 网站。该服务器上还有 SQL 服务器。

该网站的一切工作正常,但现在我发现使用 DataAdapter 填充表格存在问题。

这是一些代码,请注意,这只是代码的基本轮廓,因为实际代码包含机密信息。

public List<Summary> Fetch(string Connection, int parameter1, int parameter2, bool parameter3)
{
     List<Summary> collection = new List<Summary>();

     using (SqlConnection dbConnection = new SqlConnection(Connection))
     {
        using (SqlCommand dbCommand = dbConnection.CreateCommand()) // Result is complex
        {
            dbCommand.CommandType = CommandType.StoredProcedure;
             
            //
            // Code to add parameters and set commandText goes here
            //

            using (SqlDataAdapter da = new SqlDataAdapter(dbCommand))
            {
                DataTable table = new DataTable();
                DataRow row;

                try
                {
                  da.Fill(table);
                }
                catch(Exception ex)
                {
                   // Log error
                }
                
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    row = table.Rows[i];
                    Summary data = Populate(row);
                    collection.Add(data);
                }
            }
         }
     }
     return collection;
}
Run Code Online (Sandbox Code Playgroud)

上面的内容位于库中,在 Web Forms 站点中的调用方式如下。

var Summaries = MyLibrary.Fetch(ConnectionString, 1, 111, false);
Run Code Online (Sandbox Code Playgroud)

正如我所说,一切都很顺利。现在,上面突然停止工作并且Summaries总是空的。

为了调查我尝试了以下方法。

使用 xUnit 创建一个测试,其参数与网站使用的参数相同。这些是在调试过程中捕获的,以确保它们匹配。结果返回 1 项。

然后,我在 SQL Management Studio 中运行存储过程,它与 xUnit 测试相匹配,返回了 1 个项目。

然后我检查了 SQL Profiler,这就是事情看起来有点奇怪的地方。当网络表单调用图书馆时,跟踪中没有记录任何内容。

因此,网站和 xUnit 测试都使用相同的库,传递相同的参数,但其中一个可以工作,而另一个则不能……非常奇怪。

作为最后的手段,我将库项目添加到 Web Forms 项目中,并继续进行调试...然后我发现了错误。

da.Fill(table);
Run Code Online (Sandbox Code Playgroud)

上面的行生成了以下异常。

抛出异常: Microsoft.Data.SqlClient.dll 中的“Microsoft.Data.SqlClient.SqlException” 已成功与服务器建立连接,但在登录过程中发生错误。(提供程序:SSL 提供程序,错误:0 - 证书链是由不受信任的机构颁发的。)

看看这里的堆栈,我看到了很多回复,我需要安装证书。

我的问题是,如果是这样的话,那么为什么以及为什么现在呢?从运行到现在,代码没有任何变化。该网站和 SQL 服务器位于同一 Windows 服务器上。另外,为什么在没有它的情况下 xunit 测试可以工作,而当我在同一台机器上调试时,网站却不能工作!

我现在更改的唯一项目是安装 .Net 6 和星期二补丁,导致一些更新和服务器重新启动。

Pie*_*pen 73

Microsoft.Data.SqlClient 4.0 默认使用 ENCRYPT=True。您可以将证书放在服务器上(不是自签名的证书),或者将

TrustServerCertificate=是;

在连接字符串上。


小智 22

我也遇到了这个问题。网络6.0

当我升级Microsoft.EntityFrameworkCore.SqlServer时,它突然开始发生

从版本=“6.0.0”到版本=“6.0.1”

我将EncryptTrustServerCertificate添加到连接字符串中。

数据源=(本地);初始目录=XXXXXXX;Trusted_Connection=True;MultipleActiveResultSets=True;加密=真;TrustServerCertificate = True