開始之前,說說 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 即可完成。且慢,先別急著動手,刺激的在後面… 以下是這陣子雞飛狗跳摸石頭過河後的心得整理,短短幾行卻血淚交織,價值不斐:

  1. 停用 TLS 1.0 後遠端桌面連不上
    「用遠端桌面登入主機,設好 Registry 重開機後就再也連不進去了」這種劇情很驚險刺激吧?
    Windows 7 及 Windows 2008 R2 需先安裝更新,遠端桌面程式需更新到新版才支援 TLS 1.1/1.2 連線。
  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 詳細版本資訊的查詢方式,可參考前幾天的文章
  3. 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。
  4. 連線 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 協定不相容,錯誤訊息應會有線索才對。

Post a comment