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

Posted

技术标签:

【中文标题】突然 - \'证书链是由在 Microsoft.Data.SqlClient 中不受信任的机构颁发的\'在工作项目中【英文标题】:Sudden - 'The certificate chain was issued by an authority that is not trusted in Microsoft.Data.SqlClient' in working project突然 - '证书链是由在 Microsoft.Data.SqlClient 中不受信任的机构颁发的'在工作项目中 【发布时间】:2022-01-03 19:35:05 【问题描述】:

我有一个在 Windows 服务器上的 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;

以上内容在库中,在 Web 表单站点中这样调用。

var Summaries = MyLibrary.Fetch(ConnectionString, 1, 111, false);

正如我所说,一切正常。现在,突然间上面的内容停止了工作,Summaries 总是空的。

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

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

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

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

因此,网站和 xUnit 测试都使用同一个库,传递相同的参数,但一个有效,另一个没有……很奇怪。

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

da.Fill(table);

以上行产生了以下异常。

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

在堆栈上环顾四周,我看到很多回复说我需要安装证书。

我的问题是,如果是这样,那么为什么以及为什么现在? 从工作到现在,代码没有任何变化。网站和 SQL 服务器在同一个 windows 服务器上。另外,为什么没有它xunit测试可以工作,而我在同一台机器上调试时网站不能!

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

【问题讨论】:

为什么是现在?所有证书都有到期日,这可能刚刚发生。我建议查看证书链 (top-password.com/blog/…) 并仔细检查是否没有过期。如果您使用像 StartSSL 这样的 CA,则根 CA 不再受信任(他们做了一些坏事并受到 Microsoft/Google/每个人的正确惩罚) 那么为什么 web-forms 项目关心这个证书,而 xunit 测试项目却不关心,使用相同的连接字符串在同一台机器上运行? SQL Server 安装了自签名的 X.509 证书,因此如果您在连接字符串中使用 encrypt=true 或类似名称,您通常会从一开始就看到这样的错误 - 除非您也有trustServerCertificate=true。这只是现在才发生表明以下一项或多项:1)连接字符串已更改; 2) SQL Server 实例有一个 CA 提供的证书,其 ICA/根证书已过期(例如:Let's Encrypt); 3) SQL Server 实例有一个 CA 提供的证书,由于 Microsoft 受信任的根证书更新,该证书的 CA 不再受信任。 encrypt=truetrustServerCertificate=true 从未出现在连接字符串中。此外,如果 Web 表单站点和 SQL 服务器在同一台机器上,那么证书是否已经存在?仍然没有解释为什么使用相同连接字符串调用相同库的 2 个独立项目会产生不同的结果。换句话说,为什么我的 xunit 测试不需要证书? 我在将Microsoft.Data.SqlClient3.0.1 升级到4.0.0 后开始看到这个问题 【参考方案1】:

Microsoft.Data.SqlClient 4.0 默认使用 ENCRYPT=True。您要么在服务器上放置证书(不是自签名证书),要么放置

TrustServerCertificate=是;

在连接字符串上。

【讨论】:

谢谢,这提供了一个解决方案和原因。 这并不能解释为什么这个问题在我使用 v4.0.0 库后突然开始发生在我身上,但在恢复到版本 2.0 后它继续发生。就好像使用 v.4.0 永久修改了我系统中的某些内容。 我已经尝试过 Encrypt、TrustServerCertificate 的所有组合,但没有什么表现得像以前那样。看到从 v4.0.0 开始的错误,现在即使在恢复到 v2 后仍然存在。当我调用 SqlConnection.OpenAsync 时,我收到一条错误消息,提示“字典中不存在给定的键。”,这对 OpenAsync 来说毫无意义。我想知道它是否与本机 SNI 程序集有关。【参考方案2】:

我也遇到了这个问题。净 6.0

当我升级 Microsoft.EntityFrameworkCore.SqlServer

时突然开始发生

从版本="6.0.0" 到版本="6.0.1"

我在连接字符串中添加了 EncryptTrustServerCertificate

data source=(local);Initial Catalog=XXXXXXX;Trusted_Connection=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate强>=真

【讨论】:

以上是关于突然 - '证书链是由在 Microsoft.Data.SqlClient 中不受信任的机构颁发的'在工作项目中的主要内容,如果未能解决你的问题,请参考以下文章

关于SSL证书之证书链

无法纠正突然的“服务器证书验证失败”[重复]

Openssl:错误“证书链中的自签名证书”

详解SSL证书之证书链

我的 PayPal 脚本突然停止验证 SSL 证书

证书链和TLS Pinning