sqloledb 实际上在 Windows Server 2019 上使用 MSOLEDBSQL

Ric*_*Web 6 sql-server sqloledb

通过OleDbConnection 类 (System.Data.OleDb.dll)使用提供程序“sqloledb.1”的旧版软件仍在采用 TLS1.2 的 Windows Server 2019 上运行。而在带有 TSL1.2 的 Server 2016 或 2012 R2 上却不是?

Windows Server 2016 出现以下错误,这是预期的,因为它使用不支持 TLS1.2 的 sqloledb。正如此处所见,这是众所周知的

[DBNETLIB][ConnectionOpen (SECCreateCredentials()).]SSL Security error.
Run Code Online (Sandbox Code Playgroud)

Windows Server 2019 可以工作,但我不知道为什么。是否很难找到 sqloledb 并默认使用支持 TLS1.2 的新驱动程序 (MSOLEDBSQL)?

所有服务器都安装了相同版本的Microsoft OLE DB Driver for SQL Server,即 18.5。

尝试了不同版本的 SQL Server,2017 和 2019。

更新

显示版本信息的 sqloledb.dll 属性

服务器2019

sqloledb 服务器 2019

服务器2016

在此输入图像描述

Ian*_*oyd 7

SQL Server OLE DB 提供程序

OLE DB 提供程序 描述 可用 最低 SQL Server 最大TLS 安装有 状态(截至 2022 年第三季度)
SQLOLEDB “用于 SQL Server 的 Microsoft OLE DB 提供程序” 视窗2000 SQL Server 7.0 (70) 传输层安全协议1.0 Windows(MDAC) 已弃用
SQLOLEDB
2021 年更新
“用于 SQL Server 的 Microsoft OLE DB 提供程序” Windows 10 1809+ SQL Server 7.0 (70)

(TLS 1.2 需要 SQL Server 2008+)
传输层安全协议1.2 Windows(MDAC) 已弃用
SQLNCLI “SQL Server 本机客户端”(“SNAC” SQL Server 2005 SQL Server 7.0 (70) TLS 1.1注 1 手动 已弃用
SQLNCLI10 “SQL Server 本机客户端 10.0” SQL Server 2008 SQL Server 2000 (80) 传输层安全协议1.2 手动 已弃用
SQLNCLI10
2020年更新
“SQL Server 本机客户端 10.0” SQL Server 2000 (80)

(TLS 1.2 需要 SQL Server 2008+)
传输层安全协议1.2 手动 已弃用
SQLNCLI11 “SQL Server 本机客户端 11.0” SQL Server 2012 SQL Server 2005 (90) 传输层安全协议1.2 手动 已弃用
SQLNCLI11
2018年更新
“SQL Server 本机客户端 11.0” SQL Server 2005 (90)

(TLS 1.2 需要 SQL Server 2008+)
传输层安全协议1.2 手动 已弃用
MSOLEDBSQL “用于 SQL Server 的 Microsoft OLE DB 驱动程序” 2017年公告 SQL Server 2012 (110)

TLS 1.3 需要 SQL Server 2016+
传输层安全协议1.3 手动 当前的
MSOLEDBSQL19 “适用于 SQL Server 的 Microsoft OLE DB 驱动程序 19” SQL Server 2019 SQL Server 2012 (110)

(TLS 1.3 需要 SQL Server 2016+)
传输层安全协议1.3 手动 当前的

注意1 :当服务器和客户端计算机上的系统都支持 TLS 1.1 时,SQL Server 2005 的原始版本SQLNCLI“免费”支持 TLS 1.1 ,尽管 TLS 1.1 是在SQL Server 2005之后于2006 年发布的。SChannel

  • 使用“本机客户端”(SQLNCLI、SQLN10、SQLNCLI11)是没有意义的。如果有的话:使用当前支持的“MSOLEDBSQL”。有一个完整的背景故事:微软弃用了 SQL Server 的所有 OLEDB 驱动程序,而只保留 ODBC 驱动程序。一年半后,他们扭转了局面,决定“将”继续拥有 OLEDB 驱动程序,并创建了 **MSOLEDBSQL**。我们的(桌面)应用程序都使用 SQLOLEDB(因为它随 Windows 一起提供并由 Windows 提供服务)。现在“SQLOLEDB”支持 TLS 1.2,我们将不再费心切换到 MSOLEDBSQL。 (5认同)

Dav*_*oft 5

sqloledb是 Windows 的一部分,最近更新为支持 TLS 1.2。请参阅KB4580390

使用 Microsoft 数据访问组件 (MDAC) 中的数据提供程序连接到 SQL Server 时,添加了对传输层安全性 (TLS) 1.1 和 1.2 协议的支持。

因此,从“Windows 10 版本 1809、Windows Server 版本 1809”(操作系统内部版本 17763.1554)开始,这应该可以工作。

在 Windows 10 20H2 上本地测试运行

static void Main(string[] args)
{

    using (var con = new OleDbConnection("Provider=sqloledb;data source=localhost;trusted_connection=yes;Network Library=DBMSSOCN"))
    {
        con.Open();
        Console.WriteLine("Hello");
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

在服务器上强制协议加密的情况:

在此输入图像描述

并捕获此 XEvent:

CREATE EVENT SESSION [tls] ON SERVER 
ADD EVENT sqlsni.sni_trace(
    WHERE ([sqlserver].[like_i_sql_unicode_string]([text],N'%Handshake%')))
Run Code Online (Sandbox Code Playgroud)

捕获此调试消息:

text    SNISecurity Handshake Handshake succeeded. Protocol: TLS1.2 (1024), Cipher: AES 256 (26128), Cipher Strength: 256, Hash: SHA 384 (32781), Hash Strength: 0, PeerAddr: 127.0.0.1 
Run Code Online (Sandbox Code Playgroud)