前言
發生問題的環境是 DB Server 為 MS SQL 2014, Client 為 Windows 10, 應用程式為 .NET 1.1 Windows Form Application。當透過 IIS Crypto 關掉 TLS 1.0/1.1 後,有些 Windows 10 Client 執行程式時,就會發生 System.Data.SqlClient.ConnectionPool.GetConnection <System.Data.SqlClient.SqlException> SSL 安全性錯誤 的錯誤。
研究
程式是沒有走 TLS 去連接 MS SQL,但卻發生 SSL 的錯誤,而且在 Server 上的 SQL Server Configuration Manager 工具中 SQL Server 網路組態中的 MSSQLSERVER 的通訊協定 TCP/IP 中,
「強制加密」屬性是設定成 否,如下圖。為什麼應用程式會變成要走 TLS 呢?
在 Client 端透過 ODBC 去連 SQL 又都是成功的,透過 SSMS 工具去連接,沒勾選「加密連接(Y)」也是可以連線的,勾選「加密連接(Y)」反而有憑證錯誤的問題,如下圖,
後來同事 Hihi 使用自已的 Win 10 執行程式卻是沒問題的。
這樣似乎跟我們程式中自動安裝 .NET 1.1 有關係,
於是將 .NET 1.1 移除後,再進行測試,卻是出現了 pre-login handshake. provider: TCP Provider 的錯誤,
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - 遠端主機已強制關閉一個現存的連線。)
這個錯誤在網路上似乎是因為 .NET 2.X 對 TLS 1.2 Support 的問題,所以要更新 .NET 3.5 。
後來同事從 Windows 10 image 中安裝 .NET 3.5 後,重開機,再執行程式就正常了。
以下記錄 System.Data.dll 的版本來比較一下,
有問題的版本號是 2.0.50727.8662 ,
安裝 Windows 10 CD 中 .NET 3.5 後的版本號為 2.0.50727.9149
所以我們後來的解法就是不安裝我們系統提供的 .NET 1.1 (這樣程式就會使用 .NET 2.X 的 Lib (Maybe)),
再安裝 Windows 10 CD 中的 .NET 3.5 ,就沒問題了。
參考資料
Windows 停用 TLS 1.0 之配套作業整理
安裝 Net Framework 3.5 卻出現錯誤代碼 0x800F081F