129

ODBC 與 OLEDB 之 SQL Server TLS 1.2 支援問題

 3 years ago
source link: https://blog.darkthread.net/blog/sql-tls12-odbc-oledb/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
ODBC 與 OLEDB 之 SQL Server TLS 1.2 支援問題-黑暗執行緒

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

and has 12 comments

Comments

# 2020-05-19 05:04 PM 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) 謝謝

# 2020-05-25 04:15 PM 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

# 2020-07-09 04:25 PM by OCW

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

Post a comment

Comment
Name Captcha 40 + 28 =

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK