共用方式為


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 訊息之前進行,以在 TLS 中包裝 TDS 工作階段以強制執行加密,讓 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 交涉會透過未加密的連線來進行。 SQL Server 連線在 TDS 8.0 之前的版本中看起來像這樣:

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 連線加密:

  • Always On 可用性群組
  • Always On 容錯移轉叢集執行個體 (FCI)
  • SQL Server 複寫
  • 記錄傳送
  • sqlcmd 公用程式
  • bcp 公用程式
  • SQL Server CEIP 服務
  • SQL Server Agent
  • Database Mail
  • 連結的伺服器
  • 連接 SQL Server 的 Polybase 連接器

連線字串加密屬性的其他變更

下列新增項目已新增至連線字串來進行加密:

關鍵字 預設 描述
Encrypt 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 的值完全符合伺服器憑證中的 Common Name (CN)Subject Alternate Name 中的 DNS 名稱,以順利執行 TLS/SSL 連線。

Microsoft ODBC 驅動程式 18 for SQL Server 的行為變更
如果 Encrypt 設為 strict,則此設定會指定要用於伺服器憑證驗證的憑證位置 (完全相符)。 驅動程式支援 PEM、DER 與 CER 副檔名。

如果 Encrypt 設為 truefalse,而且 TrustServerCertificate 屬性未指定或設為 nulltruefalse,則驅動程式會使用連線 URL 上的 ServerName 屬性值作為主機名稱來驗證 SQL Server TLS/SSL 憑證。
HostNameInCertificate null 用於驗證 SQL Server TLS/SSL 憑證的主機名稱。 如果 HostNameInCertificate 屬性未指定或設為 null,則驅動程式會使用 ServerName 屬性值作為主機名稱來驗證 SQL Server TLS/SSL 憑證。