TDS 8.0

适用于: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 消息在客户端和服务器之间通信。

在 TDS 会话生命周期内,有三个阶段:

  • 初始化
  • 身份验证
  • 数据交换

加密在初始阶段进行协商,但 TDS 协商通过未加密的连接进行。 对于早于 TDS 8.0 的版本,SQL Server 连接如下所示:

TCP 握手 ➡️ TDS 预登录(明文)和响应(明文) ➡️ TLS 握手 ➡️ 身份验证(加密) ➡️ 数据交换(可以加密或不加密)

随着 TDS 8.0 的引入,SQL Server 连接如下所示:

TCP 握手 ➡️ TLS 握手 ➡️ TDS 预登录(加密)和响应(加密)➡️ 身份验证(加密)➡️ 数据交换(加密)

严格连接加密

为了使用 TDS 8.0,SQL Server 2022 (16.x) 将 strict 作为额外连接加密类型添加到 SQL Server 驱动程序 (Encrypt=strict)。 要使用 strict 连接加密类型,请下载最新版本的 .NET、ODBC、OLE DB、JDBC、PHP 和 Python 驱动程序。

为了防止使用 strict 连接加密的中间人攻击,用户将无法将 TrustServerCertificate 选项设置为 true 并信任服务器提供的任何证书。 用户将使用 HostNameInCertificate 选项来指定应信任的证书 ServerName。 服务器提供的证书需要通过证书验证。

不支持强制严格加密的功能

在 SQL Server 网络配置中随着 TDS 8.0 增加的 Force Strict Encryption 选项强制所有客户端使用 strict 作为加密类型。 没有 strict 连接加密的任何客户端或功能都无法连接到 SQL Server。

以下功能或工具列表仍在使用不支持 TDS 8.0 的老版本驱动程序,因此可能无法使用 strict 连接加密:

  • AlwaysOn 可用性组
  • Always On 故障转移群集实例 (FCI)
  • SQL Server 复制
  • 日志传送
  • sqlcmd 实用工具
  • bcp 实用工具
  • SQL Server CEIP 服务
  • SQL Server 代理
  • 数据库邮件
  • 链接服务器
  • 连接到到 SQL Server 的 Polybase 连接器

连接字符串加密属性的其他更改

以下新增项将添加到连接字符串中用于加密:

关键字 默认值 说明
加密 false 现有行为
true 时,如果服务器安装了证书,SQL Server 对客户端和服务器之间发送的所有数据使用 TLS 加密。 已识别的值为 truefalseyesno。 有关详细信息,请参阅连接字符串语法

行为更改
当设置为 strict 时,SQL Server 对客户端和服务器之间发送的所有数据使用 TDS 8.0。

当设置为 mandatorytrueyes 时,如果服务器安装了证书,SQL Server 将对客户端和服务器之间发送的所有数据使用具有 TLS/SSL 加密的 TDS 7.x。

当设置为 optionalfalseno 时,连接使用 TDS 7.x 并且仅在 SQL Server 需要时才加密。
TrustServerCertificate false 现有行为
设置为 true 可指定驱动程序不验证服务器 TLS/SSL 证书。 如果为 true,则在使用 TLS 加密通信层时会自动信任服务器 TLS/SSL 证书。

如果为 false,则驱动程序会验证服务器 TLS/SSL 证书。 如果服务器证书验证失败,驱动程序将引发错误并关闭连接。 默认值为 false。 确保传递给 serverName 的值与服务器证书中 Subject Alternate Name 中的 Common Name (CN) 或 DNS 名称完全匹配,以便成功建立 TLS/SSL 连接。

Microsoft ODBC Driver 18 for SQL Server 的行为更改
如果已将“加密”设置为 strict,则此设置指定要用于服务器证书验证(完全匹配)的证书的位置。 该驱动程序支持 PEM、DER 和 CER 文件扩展名。

如果“加密”设置为 truefalse,并且 TrustServerCertificate 属性未指定或设置为 nulltruefalse,则驱动程序会将连接 URL 上的 ServerName 属性值用作用来验证 SQL Server TLS/SSL 证书的主机名。
HostNameInCertificate null 验证 SQL Server TLS/SSL 证书时要使用的主机名。 如果未指定 HostNameInCertificate 属性或设置为 null,则驱动程序使用 ServerName 属性值作为主机名来验证 SQL Server TLS/SSL 证书