Sql-Server

應用 SQL Server 2008 R2 升級 10.50.6542(最新版本)後出錯

  • October 27, 2017

首先是問題:由於我對 SQL Server 2008 R2 (2016 年 3 月 3 日發布)應用了最新的更新檔,這應該使我的伺服器建構 10.50.6542 我無法再連接。這個更新檔是為了提供對 TLS 1.2 的支持。

我得到的錯誤(嘗試直接在伺服器中使用客戶端工具連接時)是

"A connection was succesfully established with the server, but then an error occurred during the pre-login handshake"

在此處輸入圖像描述

該伺服器是 Windows Server 2012 R2 並且正在執行 NET Framework 4.6.1(一些文章指嚮導致此問題的舊版本的 .NET 框架,但這不是我的情況)。

我嘗試執行以下軟體包以查看是否可以解決…

  • SQL Server Native Client(x86 和 x64)
  • Windows Server 2012 R2 和 Windows 8.1 中 .NET Framework 2.0 SP2 的修補程序匯總 3106993
  • Windows 中 .NET Framework 4.0 的修補程序匯總 3106994
  • .NET Framework 4.5.2、4.5.1 和 4.5 的修補程序匯總 3099845

…這些都不是必需的,也沒有任何幫助…

有人經歷過嗎?有什麼想法或建議嗎?

謝謝!

一次更新 24 小時後 ,我檢查了 SQL Server 錯誤日誌,查找僅包含啟動、5 次登錄嘗試失敗和停止的條目。在該時間範圍內的所有消息(總共 107 個條目)中,唯一包含錯誤之類的消息是

The SQL Server Network Interface library could not register the Service Principal Name (SPN) for the SQL Server service. Error: 0x2098, state: 15. Failure to register an SPN may cause integrated authentication to fall back to NTLM instead of Kerberos. This is an informational message. Further action is only required if Kerberos authentication is required by authentication policies.

不過,這條消息……甚至在我應用更新檔之前就已經在伺服器啟動時報告了,所以我 100% 確信這是一條紅鯡魚。由於登錄嘗試失敗,不會在 SQL Server 錯誤日誌中插入任何日誌。

另一個更新

根據我從這裡的人那裡得到的建議,我在伺服器上下載並安裝了最新版本的 SSMS(17.3)。當我這次嘗試連接時,我得到了一個不同的錯誤,所以我似乎正在進一步移動,但我還沒有到達那裡。

在此處輸入圖像描述

因此,舊版本的 SSMS 確實以 .net 3.5 為目標,即使您有較新版本的 .net 框架,客戶端連接也無法正常工作,現在的問題是為什麼我仍然得到這個“沒有程序位於管道的另一端”,即使大多數客戶端組件已更新。

我調查過(並丟棄)的更多事情

  • SQL Server 配置管理器中的“客戶端協議”順序似乎是正確的,因為 TCP/IP 位於頂部。這被認為是可能的麻煩原因,但在我的情況下,它都經過適當配置(顯然)

在此處輸入圖像描述

  • 嘗試按照對 Microsoft SQL Server 的TLS 1.2 支持中的建議安裝“Microsoft ODBC Driver for SQL Server”,但這也沒有什麼不同。安裝後,報錯資訊是一樣的
  • 嘗試在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2 中添加系統資料庫項(也按照同一篇文章中的建議)。同樣的錯誤……

最後!在陽光下嘗試了 3 天后,我找到了問題的根本原因。

啊哈!那一刻,我和一群人聚在一起,試圖理解為什麼這個更新檔在其他伺服器上部署得很好,而在這個特定的伺服器上卻沒有。

我們注意到一些不同的東西(除此之外……我們在一個組織整齊的記事本中列出)是這個 SQL Server 2008 R2 被配置為通過證書和 SQL Server 配置管理器上的一些設置進行傳輸中加密(又名 SSL 加密) :

  1. 關於協議

$$ Instance_Name $$然後屬性(證書選項卡)我們選擇了我們為加密通信而創建的證書。 2. 在同一個視窗(標誌選項卡)上,我們將數據庫引擎的 ForceEncryption 選項設置為 Yes

所以我們開始思考……如果問題出在證書本身怎麼辦?然後我們繼續刪除加密配置(SQL Server Build 10.50.6542 的更新檔仍然適用)並且連接開始工作,確認更新檔加上我們的 SSL 配置的組合是瘋狂的。

經過更多調查並通過消除過程,我們將問題縮小到我們正在使用的證書。該證書是使用 makecert (創建自簽名證書)創建的,並且沒有使用 -a 參數。這個參數告訴 makecert 使用什麼雜湊算法。如果未提供,makecert 將使用與 TLS 1.2 不兼容的預設 MD5 簽名雜湊算法。

同樣在TLS 1.2 RFC上,您可以明確地看到……

MD5
 MD5 [MD5] is a hashing function that converts an arbitrarily long
 data stream into a hash of fixed size (16 bytes).  Due to
 significant progress in cryptanalysis, at the time of publication
 of this document, MD5 no longer can be considered a 'secure'
 hashing function.

因此,為了解決這個問題,解決方案是在 makecert 中添加 -a SHA256 參數(確保您使用的是 makecert 版本 6.3.9600.17298 而不是舊版本 5.1313790.0,因為那個不支持 SHA256 作為參數)。

我正在寫所有這些,因為整個難題花了我 3 天的時間才弄清楚,我希望有一天有人會從中受益。如果只有微軟會在描述更新檔的文章中以大粗體字母表示不再支持 MD5 就好了!

感謝@Mr.Brownstone 和@sepupic 的幫助!

引用自:https://dba.stackexchange.com/questions/189328