Windows 停用 TLS 1.0 之配套作業整理
34 |
開始之前,說說 TLS。
大家朗朗上口的 SSL(Security Socket Layer),最早源於 1995 年發表的 SSL 2.0(1.0 很雷,所以從沒公開過),隨後在 1996 推出 3.0 版,IETF 於 1999 年將 SSL 標準化,因版權考量改稱為 TLS(Transport Layer Security)。就技術而言, TLS 1.0 與 SSL 3.0 很相近,而 TLS 1.0 也支援降級改用 SSL 3.0。之後 IETF 分別在 2006、2008 年再推出安全強度更高的 TLS 1.1 與 TLS 1.2。
2014 年,Google 發現 SSL 3.0 存在致命安全漏洞,而攻擊者可藉由向 TLS 發送假的錯誤提示降級至 SSL 3.0,再利用 SSL 3.0 的漏洞竊取資訊,各家瀏覽器紛紛決定禁用 SSL 3.0。因此大家常說的 SSL,其實早已經被 TLS 取代。參考來源
TLS 1.0 因 CBC 加密模式設計不良,可能遭受 BEAST 攻擊導致加密內容被解密,便落入與 SHA1 相同的命運-被業界宣判限期下架,於是,「停用 SSL 3.0 與 TLS 1.0」成為資安檢核項目之一,建議系統管理人員早日關閉。
要在 Windows 停用 TLS 1.0、啟用 TLS 1.1、TLS 1.2,只需修改 Registry 即可完成。且慢,先別急著動手,刺激的在後面… 以下是這陣子雞飛狗跳摸石頭過河後的心得整理,短短幾行卻血淚交織,價值不斐:
- 停用 TLS 1.0 後遠端桌面連不上
「用遠端桌面登入主機,設好 Registry 重開機後就再也連不進去了」這種劇情很驚險刺激吧?
Windows 7 及 Windows 2008 R2 需先安裝更新,遠端桌面程式需更新到新版才支援 TLS 1.1/1.2 連線。 - 停用 TLS 1.0 後 SQL Server 起不來
「 資料庫主機停用 TLS 1.0 並重開機,SQL Server 就起不來了」這種橋段也扣人心弦吧?
在事件檢視器可看到類似錯誤:
A fatal error occurred while creating an SSL client credential. The internal error state is 10013.
MVP Aaron Bertrand 有篇 Blog 詳細整理各版本 SQL Server 要支援 TLS 1.2 需要的最小版號,至於 SQL 詳細版本資訊的查詢方式,可參考前幾天的文章。 - SQL Server 停用 TLS 1.0 後,.NET 程式無法連上資料庫
SQL 更新並停用 TLS 1.0 後,原本使用 SqlConnection 連線 SQL 的 .NET 程式可能出現以下錯誤訊息:
使用 Integrated Security=SSPI 以 AD 登入 - A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
使用 SQL 帳號登入 - A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)
是的,ADO.NET 也得更新,請參考微軟這篇 KB,依據使用的 .NET 版本安裝對應的更新。除了 .NET 4.6,.NET 2.0/3.5/4.0 到 4.5.2 都需更新才能以 TLS 1.2 連上 SQL。 - 連線 TLS 1.2 HTTPS
.NET 客戶端使用 WebClient、WCF 以 HTTPS 連線遠端主機,也會涉及 TLS 1.0/1.1/1.2 版本議題,不同版本 .NET 的處理方式不同:
.NET 4.6 內建支援且預設使用 TLS 1.2
.NET 4.5 內建支援,但需透過 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 設為預設協定
.NET 4 本身不支援,但安裝 .NET 4.5 後即可使用 TLS 1.2,指定 TLS 1.2 的寫法為 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
(註:若不想修改 .NET 4/4.5 程式,也可透過 Registry 修改預設安全協定)
.NET 3.5 需安裝 Hotfix 才能支援
KB3154518 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win7 SP1/Win 2008 R2 SP1
KB3154519 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win8 RTM/Win 2012 RTM
KB3154520 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win8.1RTM/Win 2012 R2 RTM
KB3156421 -1605 HotFix Rollup through Windows Update for Windows 10.
事後來看遇上這些狀況合情合理,當初處理過程可不是這麼一回事:
遠端登入改完 Registry 重開機,之後遠端桌面連不進去、連進去發現 SQL Server 起不來、把 SQL 救起來後發現連 SQL 的 .NET 程式壞光光… 不知所以然胡搞瞎試搞完一回合,學新知還兼練心臟,好激刺呀~
以上是目前我蒐集到停用 TLS 1.0 所需的配套更新,未來如有發現再陸續補充更新。
2019-08-30 更新 ODBC 與 OLEDB 之 SQL Server TLS 1.2 支援問題
Comments
# by eric
通常轉換TLS1.2還有廢除舊的Cipher suite, 看registry實在有難度, 這個時候可以使用工具 https://www.nartac.com/Products/IISCrypto 另外想要檢查網站的設定是不是跟外面的標準, 可以使用Scan https://www.ssllabs.com/ssltest/
# by Jeffrey
to eric, 感謝分享,已筆記。
# by 路人
在下最近也踩到地雷,野人獻曝幫忙貢獻一點心得。 1. IBM Websphere (WAS)至少要升級到8.5.5,且要增加custom properties (https://www.ibm.com/support/knowledgecenter/en/SS2L6K_5.0.0/com.ibm.rational.relm.install.doc/topics/t_enable_tls1.2_was.html) 2. 使用ODBC的client-server程式,用戶端ODBC要安裝ODBC Driver 11或以上,或者使用SQL Native Client 11以上(似乎還要patch過,我手邊的電腦測試失敗) 3. 使用ADO連線的程式,Provider SQLOLEDB 目前不支援TLS 1.2,據說微軟會在2018 Q1重新支援 (過去曾放話說不再支援) 4. Crystal Report要升級到 2010 (版本13)以上,且如果直接從RPT裡連結資料庫的話,Connection要指向一個已經可以順利用TLS 1.2連到資料庫的ODBC。
# by Jeffrey
to 路人,感謝分享寶貴心得。
# by 接手老專案的菜鳥
黑大: 我有個系統是.NET 2.0開發的,如果安裝了.NET 4.5/或者4.6以及ADO.NET,可以在不改程式的情況強制使用TLS1.2執行嗎? 因為系統短期內要改寫有難度。
# by Jeffrey
to 接手老專案的菜鳥, https://support.microsoft.com/en-us/help/3154520/support-for-tls-system-default-versions-included-in-the-net-framework 依照文件,安裝必要的 Hotfix 並設定 Registry 修改預設使用 TLS 1.2,應不用改程式。但如果你一定要用舊版 TLS 1.0/1.1 連線的需求, 則需改程式透過 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolTypeExtensions.Tls11 / Tls10; 強制改用舊版。
# by 接手老專案的菜鳥
黑大,謝謝您!
# by 接手老專案的菜鳥
黑大: 我遇到某臺SEVER 2008R2 SP3+SQL 2008R2SP3 關掉 TLS1.0以後就連不上去了,但是遠端跟程式本身可以正常跑,SQL出現以下訊息: 建立連接至SQL Server時,發生相關或執行體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及SQL Server是否設定為允許遠端連線。(provider:具名的管線提供者,error:40 - 無法開啟至SQL Server 的連接)(Microsoft SQL Server,錯誤:2)
# by JOE
我有一台VM機放在IDC機房,Windows 2012 R2 st.SQL 2014 st. .NET FW4 有更新windows update再更新reg檔重新開機後遠端桌面無法登入 因為是VM機都是用遠桌面無法去開機 請問各位大大有甚麼方法可以解決遠端登入問題嗎? 感謝
# by Jeffrey
to JOE,Server停用TLS1.0後,遠端桌面連線(Remote Desktop Connection)客戶端程式要升級到新版。
# by Joe
To Jeffrey 感謝指導
# by Andy
黑大 ~ 請問這個問題有遇過嗎? https://social.msdn.microsoft.com/Forums/zh-TW/03f99cbc-d5d0-4f9f-b701-a9b4e9f0a9a5/web-service-38617215212497735657-2183938988?forum=236
# by Jeffrey
to Andy, HTTP 500是Server端程式錯誤,你可以參考以下方法設法看到HTTP 500的詳細錯誤訊息。 catch (WebException ex) { using (var sr=new StreamReader(ex.Response.GetResponseStream())) { Console.Write(sr.ReadToEnd()); } }
# by Rose
請問黑大 ~ 我有一台SQL 2005 做了linked server 連到SQL 2008,但因資安關係把2008的TLS1.0關閉後,2005就連結不上了。出現以下訊息,請教您可有解決之法? --------------------------------- 「已建立連結的伺服器,但連接測試失敗。您要保留連結的伺服器嗎?」 其他資訊: 執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo) TCP 提供者: 遠端主機已強制關閉一個現存的連線。 連結伺服器 "XXX.XXX.XX.XX" 的 OLE DB 提供者 "SQLNCLI" 傳回訊息 "用戶端無法建立連線"。 (Microsoft SQL Server, 錯誤: 10054)
# by Jeffrey
to Rose, 聽起來像是 SQL2005 這台沒有更新,建議朝此方向檢查。
# by 路人2
謝謝分享~
# by 路人三
停用 TLS 1.0 後遠端桌面連不上 請問版大~您下面提供的"更新"路徑~連官網都不提供patch,有無方法可以解決無法RDP困擾呢
# by 路人三
停用 TLS 1.0 後遠端桌面連不上 請問版大~您下面提供的"更新"路徑~連官網都不提供patch,有無方法可以解決無法RDP困擾呢
# by Jeffrey
to 路人三,KB文件的下載連結好像壞了,但文件有提到 Method 1: Windows Update,應可透過選擇性項目更新。 你的 OS 版本是Windows 7? 提醒 Win7 明年1月14日就會完全中止技術支援, https://support.microsoft.com/zh-tw/help/4057281/windows-7-support-will-end-on-january-14-2020 之後因不再提供安全更新,使用風險大增,建議升級作業系統。
# by 路人三
to jeffrey 目前主機是Win7 沒錯,但使用了手邊的win 10 主機也是同樣狀況發生 不曉得您是否有同樣的經驗,謝謝
# by Jeffrey
to 路人三,Win10 應該內建支援 TLS 1.2才對: Windows 8.1, Windows Server 2012 R2, Windows 10, Windows Server 2016, and later versions of Windows natively support TLS 1.2 for client-server communications over WinHTTP. 參考:https://docs.microsoft.com/zh-tw/configmgr/core/plan-design/security/enable-tls-1-2
# by REX
SQL Native Client 11需要使用QFE的版本才支援TLS 1.2,舊的AP用的版本可?s能是不支援的11.0.2100.60(在2012年發佈的)那個版本。 下載Microsoft® SQL Server® 2012 Native Client - QFE (支援TLS .12) https://www.microsoft.com/en-us/download/details.aspx?id=50402 Version: 11.0.7001.0 Date Published: 1/19/2018 KB3135244 - TLS 1.2 support for Microsoft SQL Server https://support.microsoft.com/en-us/topic/kb3135244-tls-1-2-support-for-microsoft-sql-server-e4472ef8-90a9-13c1-e4d8-44aad198cdbe
# by 小小魚
Window Server 2016 關閉 TLS1.1 和 1.0 後 會發生IIS worker CPU 過高的問題 請問要如何解決 或是 可以從哪個方向尋找 謝謝
# by Jeffrey
to 小小魚,依直覺 TLS1.2 不該造成 IIS Worker CPU 太重的負荷。我的話會先反覆驗證,確認真的是一關閉 TLS1.1/1.0 IIS w3wp CPU 就往上衝。若是,再對照 IIS Log 看關閉前後來存取的客戶端分佈有沒有明顯差異。
# by Privator
黑大好: 我有一台SQL Server伺服器(Windows Server 2012R2 + SQL Server 2014 SP3), 最近要試著開啟TLS1.2, 但是只要一開啟(原來的TLS1.0和TLS1.1沒關), 資料庫立即就連不上(SSMS無法連接, .Net 4.7的網頁程式無法連結), 出現系統錯誤10054.. Microsoft關於10054錯誤列出的可能錯誤(見下列連結)我都已經試著排查處理過, 已經不知道還能往什麼方向嘗試, 不知道黑大有沒有什麼建議的方向可以提供參考, 感謝.. ^^ https://learn.microsoft.com/zh-tw/troubleshoot/sql/database-engine/connect/tls-exist-connection-closed
# by Jeffrey
to Privator,線索有點少,建議啟用 SChannel Event Log 看能不能觀察到更多細節 https://learn.microsoft.com/zh-cn/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn786445%28v=ws.11%29#how-to-enable-schannel-event-logging
# by Privator
感謝黑大建議, 我再試看看.. ^^
# by Privator
黑大好: 上週啟用了SChannel Event Log以後, 出現的Schannel錯誤是36874, 錯誤訊息是:"An TLS 1.2 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. " 我看過了相關說明, 應該是和cipher suites設定有關, 有文章提到和群組原則的SSL Cipher Suit Order設定有關, 可是目前那台伺服器是沒有指定用什麼cipher suit order, 目前除了TLS_DHE*開頭的幾個Cipher Suite其他也都是開著的.. 目前我還找不到解決方案, 打算下載sslscan和WireShark來做進一步測試, 如果黑大有其他建議的話也請不吝賜教.. ^^
# by Jeffrey
to Privator, 用 `openssl s_client -connect <sql-ip>:1433` 可觀察測試 SQL 用什麼 Cipher,看是否跟認知的不同。 參考: https://blog.darkthread.net/blog/check-tls-version/
# by Privator
黑大好: 不好意思, 試了兩個月還是沒試出來.. @@ 我用了openssl測試, 但是出現錯誤訊息errno=10054 後來用黑大另一篇文章建議的nmap檢視cipher內容, 很奇怪的, 上面顯示了SSLv3, TLSv1.0, TLSv1.1各有哪些cipher, 但是就是沒有顯示TLSv1.2的cipher清單.. 我另外裝了wireshark, 使用TLSv1.1連結SQL Server的時候封包看起來很正常, 但是使用TLSv1.2連過去, 封包就只有本機往資料庫伺服器的Client Hello, 然後就沒有下文了.. 不知道黑大還有沒有什麼排查的建議方向..
# by Jeffrey
to Privator,你的問題是發生在 SQL Server 上?https://learn.microsoft.com/zh-tw/sql/relational-databases/security/networking/connect-with-tls-1-3?WT.mc_id=DOP-MVP-37580 這篇有個 TlsTest 工具,可以先試看看。
# by yoyo
To Privator: Windows Server 2012 TLS 1.2 所支援的Cipher Suites與Windows Server 2016+不同 要連通Server & Client需要有共同的Cipher Suites 在2016+需開放CBC Ciphers
# by Judy
黑大您好 請教 沒有指定TLS1.2的連線 打PIM服務在測試環境SQL SERVER連線成功 但正式環境連DB連線字串USER'' ==>直接帶空字串 在測試環境Windows版本為2022 測試環境也是2022 dotnet版本都為6.0.25 比對了一下僅Microsoft SQL Server的版本測試環境有載到130 正式環境僅有到120 想請問這樣的版本差異在沒有指定TLS1.2的情況下會產生以上問題嗎? 很感謝您
# by Jeffrey
to Judy, 但正式環境連DB連線字串USER'' ==>直接帶空字串 <= 這句沒有看懂。 通常若是 TLS 協定不相容,錯誤訊息應會有線索才對。