兩年多前 整理過 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

# by Link

您好 : 遇到的問題為舊系統WEB-SERVER關閉TLS1.0後出現 Microsoft OLE DB Provider for SQL Server error '80004005' Microsoft ODBC SQL Server Driver TCP/IP Sockets SSL安全設定錯誤 (DB-SERVER在不同台主機) 該網頁的連線字串是使用"driver={SQL Server};Server=XXX;DataBase=XXX;UID=XXX;PWD=XXX 請問是要確認WEB-SERVER有無安裝ODBC DRIVER FOR SQLSERVER還是要確認DB-SERVER那一台有無安裝 或是要將連線字串改寫成OLE DB (provider=XXX) 謝謝

# by Jeffrey

to Link,建議安裝新版 Microsoft OLE DB Driver for SQL Server ,再把連線字串改成 Provider=MSOLEDBSQL;Data Source=XXX;User ID=XXX;Password=XXX;Initial Catalog=XXX。

# by Link

謝謝黑大!! 依您的步驟舊系統ASP網站已可在WEBSERVER,DBSERVER(SQL)皆關閉TLS1.0的情況下正常使用TLS1.2運行

# by Jeffrey

to Link, 謝謝你的回饋,我又多蒐集到一個樣本,呵。

# by ED

您好, 想請問VB6程式中rdoConnection,是不是沒辦法透過MSOLEDBSQL連線? 試很久都不行,跑到.EstablishConnection rdDriverNoPrompt時 程式都會跳出"IM002 microsoft odbc 驅動程式管理員 找不到資料來源名稱且未指定預設的驅動程式" ... ... ... With RDOCONN .Connect = "Provider=MSOLEDBSQL;Server=" & server & ";Database=" & DBName & ";UID=" & uid & ";PWD=" & pwd & ";DSN=;" .LoginTimeout = 5 .CursorDriver = rdUseIfNeeded .EstablishConnection rdDriverNoPrompt End With

# by Jeffrey

to ED, 看到 rdoConnection,我又想起當年被 ADO、DAO、RDO 名詞搞到暈頭的時光。網站上找不到什麼討論 RDO 的文章,RDO 最新版在 2005 MDAC 2.1 ( https://en.wikipedia.org/wiki/Microsoft_Data_Access_Components ) 後就沒再更新過,可能無法支援新技術。建議試試 ADO + SQL Native Client。

# by ED

to Jeffrey, 謝謝你的回覆! 自己有測試用 SQL Native Client、ODBC Driver 13 for SQL Server等等都可以, 只是想說為甚麼MSOLEDBSQL怎麼試都不行,所以問問看,謝謝你。

# by JUSTIN

最近幾天, 用vb6開發的程式, 也遇到同樣的問題, 後來改用. Provider=MSOLEDBSQL 並更新 https://docs.microsoft.com/zh-tw/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15 就順利解決了~ 謝謝你

# by OCW

我想問一下,我的sql2014把TLS1.0關閉之後出現 [DBNETLIB][ConnectionOpen (SECDoClientHandshake()).]SSL 安全設定錯誤。 因為我找不到連線字串的修改位置 像是driver={SQL Server};Server=XXX;DataBase=XXX;UID=XXX;PWD=XXX的位置 請問一下,這個位置是在哪邊呢??

# by Jeffrey

to OCW, 連線字串的儲存方式依應用程式或軟體而異,沒有一致的做法,建議詢問廠商或開發人員。

Post a comment


78 - 18 =