適用於: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 交涉會透過未加密的連線來進行。 SQL Server 連線在 TDS 8.0 之前的版本中看起來像這樣:
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。
只有 TDS 7.x 支援非加密 (選用) 通訊,TDS 8.0 不支援此功能。 TDS 7.x 支援使用 TLS 進行加密,最高可達 1.2 版。 TDS 8.0 需要加密 – 所有內容一律使用 TDS 8.0 (Encrypt=Strict) 加密。 TDS 8.0 沒有最低 TLS 版本需求,並支援 TLS 1.3。 TLS 1.3 支援取決於作業系統版本。 下表摘要說明各種案例,其中包含加密選項,以及對應的 TLS 和 TDS 版本。
| 加密 選項 |
已啟用 TLS 版本 | 操作系統版本 | 預期 連接 結果 |
註釋 |
|---|---|---|---|---|
| Strict | 僅限 TLS 1.3 (或更新版本) | Windows 11 Windows Server 2022 及更新版本 |
成功 | TLS 1.3 已協商;觸發 TDS 8.0(Encrypt=Strict) |
| Strict | TLS 1.2 和 TLS 1.3 | Windows 11 Windows Server 2022 及更新版本 |
成功 | TLS 1.3 已協商;觸發 TDS 8.0(Encrypt=Strict) |
| Strict | 僅限 TLS 1.2 (或更早版本) | Windows 11 Windows Server 2022 及更新版本 |
成功 | TLS 1.2 協商; TDS 8.0 觸發 (Encrypt=Strict) |
| Strict | 僅限 TLS 1.2 (或更早版本) | Windows 10 Windows 伺服器 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 (或更早版本) | 視窗11 Windows Server 2022 及更新版本 |
成功 | TLS 1.2 協商;未觸發 TDS 8.0 (Encrypt=強制) |
| 強制的 | 僅限 TLS 1.2 (或更早版本) | Windows 10 Windows 伺服器 2019 / 2016 |
成功 | TLS 1.2 協商;此作業系統不支援 TDS 8.0 (使用 TDS 7.x) |
| 可選 | 僅限 TLS 1.3 (或更新版本) | Windows 11 Windows Server 2022 及更新版本 |
Failure | Encrypt=選用 (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 未觸發(加密=選用) |
| 可選 | 僅限 TLS 1.2 (或更早版本) | Windows 10 Windows 伺服器 2019 / 2016 |
成功 | TLS 1.2 協商;加密可選;連接可以 無需加密即可成功 |
| 任意 | 僅限 TLS 1.3 (或更新版本) | Windows 10 Windows 伺服器 2019 / 2016 |
Failure | 此作業系統不支援 TLS 1.3 |
如需用戶端如何使用不同 TDS 版本的詳細資訊,請參閱 變更連接字串加密內容 一 節中的關鍵字使用方式。
SQL Server 2025 支援
SQL Server 2025 (17.x) 預覽版引進了 TDS 8.0 對下列命令列工具和 SQL Server 功能的支援:
- SQL Server 代理程式
- sqlcmd 公用程式
- bcp 公用程式
- SQL VSS 寫入器
- SQL CEIP 服務
- PolyBase
- Always On 可用性群組
- Always On 容錯移轉叢集執行個體 (FCI)
- 連結伺服器1
- 交易性複製1
- 合併式複製1
- 快照複寫1
- 日誌傳送1
1TDS 8.0 支援會導致這些特性的 破壞性變更 。
嚴格連線加密
若要使用 TDS 8.0,SQL Server 2022 (16.x) 已新增 strict 為 SQL Server 驅動程式 (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 或 false,且 TrustServerCertificate 屬性未指定或設定為 null、 true或 false,驅動程式會使用 ServerName 連線 URL 上的 屬性值作為主機名來驗證 SQL Server TLS/SSL 憑證。 |
HostNameInCertificate |
null |
用於驗證 SQL Server TLS/SSL 憑證的主機名稱。
HostNameInCertificate如果屬性未指定或設定為 null,驅動程式會ServerName使用 屬性值作為主機名來驗證 SQL Server TLS/SSL 憑證。 |