兩年多前 整理過 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, 連線字串的儲存方式依應用程式或軟體而異,沒有一致的做法,建議詢問廠商或開發人員。

# by 骨董修復菜鳥

黑大您好: 我們有個classic asp的骨董系統,按照您的文章步驟跑TLS1.2,近期更新SQL 後,相同密碼可正常於資料庫登入,但系統上的同樣密碼會說不符,經過比對,資料庫是已被加密過的密碼,但classic asp要怎樣可以使用加密過的密碼登入呢?

# by Jeffrey

to 骨董修復菜鳥, 你說的密碼是 SQL 登入帳號的密碼,還是系統自訂會員或使用者帳號系統的密碼?(感覺是後者) TLS1.2 啟用與否決定你能不能連上 SQL,不應影響密碼比對結果,看到密碼不符錯誤訊息及資料庫是加密過的密碼這兩點聽起來像是骨董系統的邏輯,非 TLS Issue。

# by 骨董修復菜鳥

黑大: 經過我們測試,我們是您在https://blog.darkthread.net/blog/view-sql-encrypt-certificate/提到的環境下執行,但是因為 classic asp 沒有直接支援SHA加密,所以進SQL密碼還是我們原始處理過的密碼,在SQL(跑TLS1.2)用處理過的密碼可以登入,封包也確認二者密碼不同,SQL錯誤LOG上也出現密瑪不符狀況,我們考慮一個做可供classic asp呼叫的元件可能是比較快的解法,還是說 可以直接呼叫.net 的加密函式來用?

# by Jeffrey

to 骨董修復菜鳥,如果 .NET 已有現成函式可用,我會選擇把它包成 CCW 給 ASP 呼叫。參考:https://blog.darkthread.net/blog/ccw-example/

# by 骨董修復菜鳥

謝謝黑大,我們試看看。

# by 樂透無名

看到TLS就頭昏,找解答找來這裡 沒有第二句,只能跪謝了(跪)

# by REX

發現一個好用的檢測工具,也謝謝黑大一直造福苦命IT https://github.com/Microsoft/tigertoolbox/tree/master/tls1.2 CheckClientUpdates.ps1 The PowerShell Script currently supports the following: Check if SQL Server Native Client can support TLS 1.2 Check if Microsoft ODBC Driver for SQL Server can support TLS 1.2 This script is restricted to work on x64 and x86 platforms

# by Jeffrey

to REX, 好東西! 謝謝分享。

# by opoepev (Yi-Chun Lu)

今天遇到一個雷~想說分享一下! MSOLEDB 的版本,要用裝18的版本才會正常(也就是黑大文章中的連結即可) 今天下載到19的版本安裝後…MSOLEDBSQL一樣無法使用!因為它會獨立產生一個 msoledbsql19.dll 有夠雷的...(我找了二個小時,交叉比對才發現...)

# by yoyo

Microsoft ODBC Driver 11 需要更新新版才能支援TLS 1.2 Microsoft ODBC Driver 11 for SQL Server with version 11.0.2270.0 : Fail Microsoft ODBC Driver 11 for SQL Server with version 12.2.5543.11 : Pass

# by CC

請問黑大, 目前web sever的driver版本是ODBC Driver 11 for SQL Server, 該Web Server有連線多個Ms SQL DB的需求, 大部分DB不會有問題, 唯有最近升級的DB server出現與黑大一樣的訊息, 想問是該DB Server的版本有什麼個體差異嗎? 謝謝

# by Judy

請教 沒有指定TLS1.2的連線 打PIM服務在測試環境SQL SERVER連線成功 但正式環境連DB連線字串USER'' ==>直接帶空字串 在測試環境Windows版本為2022 測試環境也是2022 dotnet版本都為6.0.25 比對了一下僅Microsoft SQL Server的版本測試環境有載到130 正式環境僅有到120 想請問這樣的版本差異在沒有指定TLS1.2的情況下會產生以上問題嗎? 很感謝您

Post a comment