适用于:SQL Server 2022 (16.x)
Azure SQL 数据库
Azure SQL 托管实例
SQL Server 2022 (16.x)、Azure SQL 数据库和 Azure SQL 托管实例支持表格格式数据流 (TDS) 8.0。
表格格式数据流 (TDS) 协议是客户端用来连接到 SQL Server 的应用层协议。 SQL Server 可以使用传输层安全性 (TLS) 对通过网络在 SQL Server 实例与客户端应用程序之间传输的数据进行加密。
TDS 是一种安全协议,但在以前版本的 SQL Server 中,可以关闭或不启用加密。 为了满足使用 SQL Server 时强制加密的标准,引入了 TDS 协议迭代:TDS 8.0。
TLS 握手现在位于任何 TDS 消息之前,将 TDS 会话包装在 TLS 中以强制加密,使 TDS 8.0 与 HTTPS 和其他 Web 协议保持一致。 这一增强极大地促进了 TDS 流量可管理性,因为标准网络设备现在能够筛选和安全传递 SQL 查询。
与以前的 TDS 版本相比,TDS 8.0 的优势在于其与 TLS 1.3 的兼容性,以及随附的 TLS 标准。 TDS 8.0 还与 TLS 1.2 和以前的 TLS 版本完全兼容。
TDS 的工作原理
表格格式数据流 (TDS) 协议是一种应用程序级协议,用于在客户端和数据库服务器系统之间传输请求和响应。 客户端系统通常与服务器建立长期连接。 使用传输级协议建立连接后,将交换 TDS 消息以在客户端和 SQL Server 之间通信。
在 TDS 会话生命周期内,有三个阶段:
- 初始化
- 身份验证
- 数据交换
加密在初始阶段进行协商,但 TDS 协商通过未加密的连接进行。 对于早于 TDS 8.0 的版本,SQL Server 连接如下所示:
TCP 握手 ➡️ TDS 预登录(明文)和响应(明文) ➡️ TLS 握手 ➡️ 身份验证(加密) ➡️ 数据交换(可以加密或不加密)
随着 TDS 8.0 的引入,SQL Server 连接如下所示:
TCP 握手 ➡️ TLS 握手 ➡️ TDS 预登录(加密)和响应(加密)➡️ 身份验证(加密)➡️ 数据交换(加密)
TDS、TLS、OS 和加密选项的兼容性矩阵
可以在 OS 级别启用 TLS 1.2 和 TLS 1.3 版本,这允许客户端连接到 SQL Server 使用多个 TDS 协议版本(TDS 7.x 和 8.0)。 默认情况下,可能会启用 TLS 1.2 和 TLS 1.3,具体取决于 OS 版本。
只有 TDS 7.x 支持非加密(可选)通信,TDS 8.0 不支持此通信。 TDS 7.x 支持使用最高版本 1.2 的 TLS 进行加密。 TDS 8.0 需要加密 - 所有内容始终使用 TDS 8.0 加密(Encrypt=Strict)。 TDS 8.0 没有最低 TLS 版本要求,并且支持 TLS 1.3。 TLS 1.3 支持依赖于作系统版本。 下表总结了各种方案,其中包含加密选项以及相应的 TLS 和 TDS 版本。
| 加密 选项 |
已启用 TLS 版本 | OS 版本 | 预期 连接 outcome |
注释 |
|---|---|---|---|---|
| 严格 | 仅 TLS 1.3(或更高版本) | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.3;触发 TDS 8.0 (Encrypt=Strict) |
| 严格 | TLS 1.2 和 TLS 1.3 | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.3;已触发 TDS 8.0(加密=严格) |
| 严格 | 仅 TLS 1.2(或更早版本) | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.2;触发 TDS 8.0(Encrypt=Strict) |
| 严格 | 仅 TLS 1.2(或更早版本) | Windows 10操作系统 Windows Server 2019 / 2016 |
成功 | 已协商 TLS 1.2;触发 TDS 8.0(TLS 1.3 不可用) |
| 强制的 | 仅限 TLS 1.3(或更高版本) | Windows 11 Windows Server 2022 和更高版本 |
Failure | Encrypt=Mandatory 与 TDS 8.0 的 TLS 1.3 不兼容 |
| 强制的 | TLS 1.2 和 TLS 1.3 | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.2;TDS 8.0 未触发(加密=强制) |
| 强制的 | 仅 TLS 1.2(或更早版本) | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.2 且 TDS 8.0 未触发 (Encrypt=Mandatory) |
| 强制的 | 仅 TLS 1.2(或更早版本) | Windows 10操作系统 Windows Server 2019 / 2016 |
成功 | 已协商 TLS 1.2;该操作系统不支持 TDS 8.0(使用 TDS 7.x) |
| 可选 | 仅 TLS 1.3(或更高版本) | Windows 11 Windows Server 2022 和更高版本 |
Failure | Encrypt=Optional (false) 是 TDS 7.x,它与 TLS 1.3 不兼容。 |
| 可选 | TLS 1.2 和 TLS 1.3 | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.3; TDS 8.0 未触发(加密=可选) |
| 可选 | 仅 TLS 1.2(或更早版本) | Windows 11 Windows Server 2022 和更高版本 |
成功 | 已协商 TLS 1.2;TDS 8.0 未触发(Encrypt=Optional) |
| 可选 | 仅 TLS 1.2(或更早版本) | Windows 10操作系统 Windows Server 2019 / 2016 |
成功 | 已协商 TLS 1.2;加密可选;连接可以 在没有加密的情况下成功 |
| 任意 | 仅 TLS 1.3(或更高版本) | Windows 10操作系统 Windows Server 2019 / 2016 |
Failure | 此 OS 不支持 TLS 1.3 |
有关客户端如何使用不同 TDS 版本的详细信息,请参阅 更改连接字符串加密属性 部分中的关键字用法。
SQL Server 2025 支持
SQL Server 2025 (17.x) 预览版引入了对以下命令行工具和 SQL Server 功能的 TDS 8.0 支持:
- SQL Server 代理
- sqlcmd 实用工具
- bcp 实用工具
- SQL VSS 编写器
- SQL CEIP 服务
- Polybase
- AlwaysOn 可用性组
- AlwaysOn 故障转移群集实例 (FCI)
- 链接服务器1
- 事务复制1
- 合并复制1
- 快照复制1
- 日志传送1
1TDS 8.0 支持引入了这些功能 的重大更改 。
严格连接加密
若要使用 TDS 8.0,SQL Server 2022 (16.x) 向 SQL Server 驱动程序添加了 strict 作为额外的连接加密选项 (Encrypt=strict)。 若要使用 strict 连接加密类型,请下载最新版本的 .NET、ODBC、OLE DB、JDBC、PHP 和 Python 驱动程序:
- 适用于 SQL Server 和 Azure SQL 数据库的 Microsoft ADO.NET 5.1 版本或更高版本
- ODBC Driver for SQL Server 18.1.2.1 版本或更高版本
- Microsoft OLE DB Driver for SQL Server 版本 19.2.0 或更高版本
- Microsoft JDBC Driver for SQL Server 11.2.0 版本或更高版本
- Microsoft Drivers for PHP for SQL Server 5.10 版本或更高版本
- Python SQL 驱动程序 - pyodbc
为了通过 strict 连接加密来防止中间人攻击,用户不能将 TrustServerCertificate 选项设置为 true,也不能允许服务器提供的任何证书。 用户将使用 HostNameInCertificate 选项来指定应信任的证书 ServerName。 服务器提供的证书需要通过证书验证。 有关证书验证的详细信息,请参阅 SQL Server 的证书要求
不支持强制严格加密的功能
在 SQL Server 网络配置中随着 TDS 8.0 增加的 Force Strict Encryption 选项强制所有客户端使用 strict 作为加密类型。 没有 strict 连接加密的任何客户端或功能都无法连接到 SQL Server。
以下功能或工具列表仍在使用不支持 TDS 8.0 的老版本驱动程序,因此可能无法使用 strict 连接加密:
- 数据库邮件
连接字符串加密属性的其他更改
以下选项添加到连接字符串以加密通信:
| 关键字 | 默认值 | 说明 |
|---|---|---|
Encrypt |
假 |
以前的连接字符串选项 有效选项为 - true或 yes - false或 no。 有关详细信息,请参阅连接字符串语法。 当 true,如果服务器安装了证书,则 SQL Server 对客户端和服务器之间交换的所有数据使用 TLS 1.2 加密。最新的连接字符串选项 有效选项为 - strict - mandatory或 true或 yes - optional或 false, 或 no。 将其设置为 strict时,SQL Server 对客户端和服务器之间交换的所有数据使用 TDS 8.0。当设置为 mandatory、true 或 yes 时,如果服务器安装了证书,SQL Server 将对客户端和服务器之间发送的所有数据使用具有 TLS/SSL 加密的 TDS 7.x。当设置为 optional、false 或 no 时,连接使用 TDS 7.x 并且仅在 SQL Server 需要时才加密。 |
TrustServerCertificate |
假 |
上一个连接字符串选项 设置为 true (不建议)时,驱动程序不会验证服务器 TLS/SSL 证书。 如果 true,使用 TLS 加密通信层时,服务器 TLS/SSL 证书会自动受信任(绕过验证)。如果为 false,则驱动程序会验证服务器 TLS/SSL 证书。 如果服务器证书验证失败,驱动程序将引发错误并关闭连接。 默认值为 false。 确保传递给 serverName 的值与服务器证书中 Common Name (CN) 中的 Subject Alternate Name 或 DNS 名称完全匹配,以便成功建立 TLS/SSL 连接。Microsoft SQL Server ODBC 驱动程序 18 及更高版本的行为更改 如果 Encrypt 设置为 strict,则此设置指定要用于服务器证书验证的证书的位置(完全匹配)。 该驱动程序支持 PEM、DER 和 CER 文件扩展名。如果 Encrypt设置为true或未指定或falseTrustServerCertificate设置为nulltrue该属性,或者false驱动程序使用ServerName连接 URL 上的属性值作为主机名来验证 SQL Server TLS/SSL 证书。 |
HostNameInCertificate |
null |
验证 SQL Server TLS/SSL 证书时要使用的主机名。 如果未指定或设置为HostNameInCertificate该null属性,驱动程序将使用ServerName属性值作为主机名来验证 SQL Server TLS/SSL 证书。 |