Sql-Server

為 SQL Server 2016 數據庫郵件啟用 TLS 1.2

  • January 11, 2022

我被這個問題困擾了將近 1 週。希望我們社區中的某個人遇到過同樣的問題並且已經找到了解決方案。

所以這是我的問題:

根據我們公司的政策,我們希望數據庫郵件能夠在啟用 TLS 1.2 並禁用 TLS 1.0 和 TLS 1.1 的情況下通過埠 25 發送電子郵件。

我們的郵件伺服器是 Exchange Server 2010,我們的 SQL Server 2016(開發者和企業版)盒子有 Windows Server 2016 標準版的作業系統。

我們的 SQL Server 版本是:

select @@version
----------------------------------------
Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) - 13.0.4466.4 (X64) 
   Dec 22 2017 11:25:00 
   Copyright (c) Microsoft Corporation
   Developer Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)

我們有如下所示的 DB 郵件配置。

在此處輸入圖像描述

問題是每當我們打開 SSL

use msdb
exec dbo.sysmail_update_account_sp @account_id=2, @enable_ssl = 1;

我們不能發送數據庫郵件(無論我們的 SMTP 身份驗證是 Windows 身份驗證、基本身份驗證還是匿名身份驗證)。db郵件日誌中的錯誤資訊如下:

資訊

由於郵件伺服器故障,無法將郵件發送給收件人。(使用帳戶 2 (2018-07-30T10:52:41) 發送郵件。異常消息:無法將郵件發送到郵件伺服器。(發送郵件失敗。)。)

但是如果我們關閉這個SSL,db郵件發送出去是沒有問題的。

那麼我們如何啟用 SSL 並將 TLS 1.2 用於數據庫郵件呢?

我通過添加系統資料庫啟用了 TLS 1.2,如下所示

在此處輸入圖像描述

詳細資訊來自此連結(請參閱常見問題解答部分)

由於似乎沒有人能回答這個問題,我向 Microsoft 開了一個支持案例,但 MS 支持仍然花了將近 1 週的時間才得到答案,因為他通過各種內部資源得到了明確的答案。

總結是:

SQL Server 數據庫郵件使用 System.Net.Mail 來完成這項工作,System.Net.Mail 能夠使用 TLS 1.2 發送郵件,但前提是建構執行時版本為 4.6 或更高版本。SQL Server 2016 db mail 是為 .Net 3.5 建構的,因此 SQL Server 2016 db mail 目前不支持 TLS 1.2。

TLS1.2 是目前唯一被認為是安全的 TLS 版本(2019 年 3 月)。花費了相當多的時間和精力才發現有 2 個基本的附加設置需要這些設置才能正常工作,這些設置在 Microsoft 或 Web 上通常不為人所知,也沒有很好的文件記錄。 以下可以為您節省大量的時間和精力

這些是為我們解決問題的 2 個新系統資料庫設置:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

這是對我們最終找到此資訊的執行緒的引用,隱藏線上程的一半:.NET Framework 4.0 中的 TLS 1.2

下面是我放在一起的一個簡單的可執行系統資料庫文件的內容,它將進行 2 個新設置和上麵執行緒中已經顯示的設置(即,這會生成所有必要的系統資料庫設置*):

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

注意 1:需要重啟 SQL 才能使這些設置生效,但最好重啟 Windows,因為新設置通常會影響 .NET 4.x。

注意 2:在 SQL 中,必須在郵件配置文件中勾選 SSL 複選框才能使用 TLS1.2。

*注 3:僅供參考,我們執行了免費工具 Crypto V2,並在開始執行之前啟用了“最佳實踐”選項。之後我們使用新的 Crypto 版本 3 驗證了我們的更改。

希望這將為其他人節省大量時間、精力和挫敗感;)

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