Sql-Server

由於 TLS 1.0 關閉,SQL Server CLR 方法失敗

  • April 11, 2018

我有一個使用 .Net 2 的舊 CLR 程序集,當我們的 TLS 1.0 連接出於安全原因而關閉時,我從程序集發出的呼叫(將文章發送到 https 端點)返回給我們

底層連接已關閉:發送時發生意外錯誤。—> System.IO.IOException: 身份驗證失敗,因為遠端方已關閉傳輸流。

我們認為我們需要升級程序集以使用 .Net 4(特別是 4.5.2)以使其使用仍處於活動狀態的 TLS 1.1。我升級了項目和程序集,但仍然收到該消息。

我需要在 SQL Server 或作業系統中做些什麼來強制 TLS 1.1 連接嗎?

如果您仍然收到該錯誤,那麼連接的要求可能實際上是 TLS 1.2 而不是 1.1,並且 1.2 直到 .NET Framework 版本 4.6 才成為預設值。因此,您可以嘗試使用 4.6 的目標框架版本進行編譯,也可以通過設置類的SecurityProtocol屬性來強制 TLS 版本使用 1.2(或同時支持 1.1 和 1.2) ServicePointManager。有以下列舉值:

  • SecurityProtocolType.Tls12
  • SecurityProtocolType.Tls11

但是,根據您使用的 .NET Framework 版本,這些值可能尚未添加到列舉中。但這無關緊要,因為您只需指定列舉值轉換為的數值:

  • (SecurityProtocolType)3072對於 TLS 1.2
  • (SecurityProtocolType)768對於 TLS 1.1

如果您的程式碼沒有通過設置覆蓋,似乎還有一個系統資料庫設置來強制使用 TLS 版本ServicePointManager.SecurityProtocol

我認為對於我的SQL#項目,我為包含 SQLCLR 方法的主類使用了一個靜態類建構子,該方法ServicePointManager.SecurityProtocol在載入時設置一次。而且enum是一個“HasFlags”列舉,所以可以指定多個版本,比如:

ServicePointManager.SecurityProtocol =
   SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

或者可能:

ServicePointManager.SecurityProtocol =
   SecurityProtocolType.Tls11 | (SecurityProtocolType)3072;

另請參閱:

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