本文說明 Microsoft ODBC Driver 18 for SQL Server 與版本 17 之間的破壞性變更。
大多數從版本 17 升級到 18 的應用程式會受到單一變更的影響:連線預設是加密的。 如果升級後應用程式停止連線,請先閱讀 預設加密行為 。
變更的摘要
| Area | 版本 17 | 版本 18 及以後版本 |
|---|---|---|
預設設定Encrypt |
no |
yes |
Encrypt 公認的價值觀 |
yes、no |
yes、、 no、 Mandatory、 Optional、 Strict |
| 加密模式 | 關著還是開 | 關、開或嚴格 |
| 伺服器憑證驗證 | 除非你要求加密,否則不會發生 | 這是預設發生的,因為加密本身就開啟了 |
| 連接字串關鍵字 | 基礎組 | 基礎集加上新關鍵字 |
加密方式變更
預設加密行為
在版本 17 中,除非你要求加密或伺服器要求加密,否則連線不會被加密。 在第 18 版及以後版本中,連線預設為加密狀態。
由於驅動程式在加密連線時會驗證伺服器憑證,因此連接自簽或不信任憑證的伺服器的應用程式,在版本 17 成功連線,失敗於版本 18。 失敗是憑證驗證錯誤,而非認證錯誤。
你有三種解決方式,依安全性從高到低排列:
- 在客戶信任的伺服器上安裝憑證。 這個選項是推薦的,也是唯一同時保留加密和驗證的。
- 保持加密狀態,並透過設定
HostNameInCertificate或ServerCertificate告訴驅動程式要驗證哪個名稱。 - 關閉加密以恢復 17 版預設值,方法是在 連接字串 中加入
Encrypt=no。
注意事項
設定 TrustServerCertificate=yes 會保持連線加密,但會停用憑證驗證,使連線暴露於中間攻擊者攻擊的可能。 偏好可信憑證。
加密值
版本 17 僅 yes 接受 和 no。 第 18 版及以後版本接受這些數值,並新增三個數值:
| 價值 | 相當於 | 行為 |
|---|---|---|
Mandatory |
yes |
連線是加密的。 |
Optional |
no |
除非伺服器要求,否則連線不會被加密。 |
Strict |
沒有 | 連線採用 TDS 8.0 加密。 |
Strict 沒有版本 17 的對應版本。 這是唯一選擇 TDS 8.0 的數值,因為加密是在登入交換前協商,而非交換中。
還原版本 17 的加密行為
要恢復版本 17 的預設行為,請明確設定 Encrypt :
Driver={ODBC Driver 18 for SQL Server};Server=<server>;Database=<database>;UID=<user_id>;PWD=<password>;Encrypt=no;
即使在版本 17 上,明確設定該值也很有幫助,因為這讓 連接字串 在兩個版本中行為相同。
新 連接字串 關鍵字
版本 18 新增了以下 連接字串 關鍵字,但版本 17 無法識別:
| Keyword | Purpose |
|---|---|
ConcatNullYieldsNull |
控制串接空值是否會產生空值。 |
GetDataExtensions |
控制驅動程式啟用的 SQLGetData 擴充功能。 |
HostNameInCertificate |
指定伺服器 TLS 憑證中要驗證的主機名稱。 |
IpAddressPreference |
指定驅動程式先嘗試的 IP 位址族群。 |
LongAsMax |
將長資料型態映射到其 max 對應資料。 |
RetryExec |
配置 針對失敗查詢的重試規則。 |
ServerCertificate |
指定憑證檔案的路徑,用以驗證伺服器。 |
不同的 18 版本中引入了個別關鍵字。 關於引入每個關鍵字的版本,以及完整的關鍵字參考,請參見 ODBC DSN 與 連接字串 關鍵字。