为 SQL Server 2016 数据库邮件启用 TLS 1.2

jya*_*yao 8 sql-server database-mail sql-server-2016 tls-1.2

我对这个问题困惑了将近 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)
Run Code Online (Sandbox Code Playgroud)

我们有如下所示的 DB 邮件配置。

在此处输入图片说明

问题是每当我们打开 SSL

use msdb
exec dbo.sysmail_update_account_sp @account_id=2, @enable_ssl = 1;
Run Code Online (Sandbox Code Playgroud)

我们不能发送 db 邮件(无论我们的 SMTP 身份验证是 Windows 身份验证、基本身份验证还是匿名身份验证)。db邮件日志中的错误信息如下:

信息

由于邮件服务器故障,无法将邮件发送给收件人。(使用帐户 2 (2018-07-30T10:52:41) 发送邮件。异常消息:无法向邮件服务器发送邮件。(发送邮件失败。)

但是如果我们关闭这个SSL,发送db邮件就没有问题了。

那么我们如何启用 SSL 并使用 TLS 1.2 来处理数据库邮件呢?

我通过添加注册表启用了 TLS 1.2,如下所示

在此处输入图片说明

详细信息来自此链接(请参阅常见问题部分)

Zee*_*eek 14

TLS1.2 是目前唯一被认为安全的 TLS 版本(2019 年 3 月)。花了相当多的时间和精力才发现,有 2 个必要的附加设置才能使这项工作正常运行,但 Microsoft 或一般在网络上并不为人所知,也没有详细记录。 以下内容可以为您节省大量时间和精力

这些是为我们解决问题的 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
Run Code Online (Sandbox Code Playgroud)

这是对我们最终发现此信息的线程的引用,该线程隐藏在线程的中间:.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
Run Code Online (Sandbox Code Playgroud)

注 1:这些设置需要重启 SQL 才能生效,但最好重启 Windows,因为新设置通常会影响 .NET 4.x。

注 2:在 SQL 中,必须在邮件配置文件中勾选 SSL 复选框才能使用 TLS1.2。

*注 3:仅供参考,我们运行了免费工具 Crypto V2,并在开始运行之前启用了“最佳实践”选项。我们随后使用新的 Crypto 版本 3 验证了我们的更改。

希望这会为其他人节省大量的时间、精力和挫折;)

  • 我想更进一步:由于 Microsoft 最终于 2022 年 1 月 31 日在 Exchange Online 上关闭了 TLS &lt;1.2,我们的 SQL 数据库邮件从今天起就失败了。错误是:“由于邮件服务器故障,邮件无法发送到收件人。异常消息:无法将邮件发送到邮件服务器。(发送邮件失败。)”添加此注册表信息,然后右键单击 SSMS 中的 SQL 代理,然后重新启动足以让数据库邮件再次工作(而不是必须立即重新启动或重新启动所有 SQL 服务)。希望这对其他人有帮助...... (3认同)

Alb*_*nez 6

这很奇怪,因为链接的文章明确指出:

支持 Windows 8.1 和 Windows Server 2012 R2 上的 .NET Framework 版本 3.5 SP1 中包含的 TLS v1.2

这与您从 MS 支持获得的响应相矛盾。编辑:我在这个 StackOverflow 问题中发现,虽然 .NET 3.5 最初不包括对 TLS 1.2 的支持,但后来由 MS 添加了:

支持 Windows 7 SP1 和 Server 2008 R2 SP1 上的 .NET Framework 3.5.1 中包含的 TLS 系统默认版本

阅读常见问题解答部分后,我认为问题在于您在启用 TLS 1.2 时错过了一个注册表项。常见问题解答部分说:

正确的注册表设置如下:

[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  
Run Code Online (Sandbox Code Playgroud)

服务器和客户端计算机都需要这些设置。

但在您提供的屏幕截图中我只看到"Enabled"=dword:00000001"DisabledByDefault"=dword:00000000钥匙丢失了。

它还说:

SQL Server 2016 是否支持 TLS 1.1?

是的。Windows 版本上的 SQL Server 2016 和 SQL Server 2017 附带 TLS 1.0 到 TLS 1.2 支持。如果您只想使用 TLS 1.2 进行客户端与服务器通信,则必须禁用 TLS 1.0 和 1.1。

这可以解释为您需要禁用TLS 1.0 和 1.1 才能使用 1.2,但我不确定这一点。


jya*_*yao 5

由于似乎没有人能回答这个问题,我向微软提出了一个支持案例,但微软支持人员仍然花了近 1 周的时间才给出答案,因为他通过各种内部资源得到了明确的答案。

总结是:

SQL Server 数据库邮件使用 System.Net.Mail 来完成工作,System.Net.Mail 能够使用 TLS 1.2 发送邮件,但仅当构建运行时版本为 4.6 或更高版本时。SQL Server 2016 db 邮件是为 .Net 3.5 构建的,因此 SQL Server 2016 db 邮件目前不支持 TLS 1.2。