兩年多前 整理過 Windows 停用 TLS 1.0 之配套作業,再補上 ODBC 與 OLEDB 處理經驗。

停用 SQL Server 主機 TLS 1.0/1.1 後 ODBC 客戶端連線失敗,設定 DSN 連線看到以下錯誤:

[Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]ConnectionOpen (SECDoClientHandshake()). 
Connection failed:
SQL State: '08001'
SQL Server Error: 18
[Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]SSL Security error

爬文並實驗後得到結論:ODBC 連 SQL 有三種驅動程式選擇,ODBC Driver for SQL Server、SQL Server、SQL Server Native Client。(如下圖)

依據微軟文件,ODBC 連線 SQL 的三種驅動程式分屬不同時代, SQL Server 來自古老的 WDAC,現己不建議使用。 SQL Server Native Client 包含 ODBC 介面,是 SQL Server 2005-2012 時代主推的做法。 SQL 2012 以後則以 Microsoft ODBC Driver for SQL Server 為主。

要支援 TLS 1.2,需使用 ODBC Driver 11 for SQL Server 以上版本(圖中版本為 13,最新版為 17) 或 SQL Server Native Client 11 以上版本, 前面遇到的錯誤是用到 SQL Server 10.00.14393.0 造成的,雖然版本時間是 2016,但由於它是最早期的技術疑已遭棄坑,故不支援 TLS 1.2。

實測改用 ODBC Driver 13 for SQL Server 或 SQL Server Native Client 11 都能解決 ODBC 連 TLS 1.2 SQL 問題,故障排除。 但沒多久再遇上 ADO 連線錯誤:(對,不是 ADO.NET! 是 ASP/VB6 在用的 ADO)

Microsoft OLE DB Provider for SQL Server error '80004005'
[DBNETLIB][ConnectionOpen (SECDoClientHandshake()).]SSL Security error.

爬文得知,2017 後的新版 Microsoft OLE DB Driver for SQL Server 己支援 TLS 1.2,但有個訣竅:新舊版 OLE DB 的連線字串寫法不同,舊版是 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)、新版是 Microsoft OLE DB Driver for SQL Sever (MSOLEDBSQL)。

所以,即使已安裝新版 Microsoft OLE DB Driver for SQL Server,ADO 連線字若還是寫 Provider=SQLOLEDB;Data Source=sql-ip;User ID=user;Password=****;Initial Catalog=XXX, 會繼續使用舊版,改成 Provider=MSOLEDBSQL;.... 就能順利用 TLS 1.2 連上 SQL 囉~
(註:ADO 連線改用 SQL Native Client 也是解決辦法,寫法為 Provider=SQLNCLI11;....)

Tips of how to make ODBC and OLEDB client support TLS 1.2 conenction to SQL Server.


Comments

Be the first to post a comment

Post a comment


48 - 14 =