突然 - '证书链是由在 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=true
和 trustServerCertificate=true
从未出现在连接字符串中。此外,如果 Web 表单站点和 SQL 服务器在同一台机器上,那么证书是否已经存在?仍然没有解释为什么使用相同连接字符串调用相同库的 2 个独立项目会产生不同的结果。换句话说,为什么我的 xunit 测试不需要证书?
我在将Microsoft.Data.SqlClient
从3.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"
我在连接字符串中添加了 Encrypt 和 TrustServerCertificate。
data source=(local);Initial Catalog=XXXXXXX;Trusted_Connection=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate强>=真
【讨论】:
以上是关于突然 - '证书链是由在 Microsoft.Data.SqlClient 中不受信任的机构颁发的'在工作项目中的主要内容,如果未能解决你的问题,请参考以下文章