这个问题让我困惑了将近 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)
我们有如下所示的数据库邮件配置。
问题是每当我们打开 SSL
use msdb exec dbo.sysmail_update_account_sp @account_id=2, @enable_ssl = 1;
我们不能发送数据库邮件(无论我们的 SMTP 身份验证是 Windows 身份验证、基本身份验证还是匿名身份验证)。db mail log中报错信息如下:
信息 由于邮件服务器故障,无法将邮件发送给收件人。(使用帐户 2(2018-07-30T10:52:41)发送邮件。异常消息:无法将邮件发送到邮件服务器。(发送邮件失败。)。)
信息
由于邮件服务器故障,无法将邮件发送给收件人。(使用帐户 2(2018-07-30T10:52:41)发送邮件。异常消息:无法将邮件发送到邮件服务器。(发送邮件失败。)。)
但是如果我们把这个SSL关掉,db邮件发出去就没有问题了。
那么我们如何启用 SSL 并将 TLS 1.2 用于数据库邮件呢?
我通过添加注册表启用了 TLS 1.2,如下所示
TLS1.2 是目前(2019 年 3 月)唯一被认为安全的 TLS 版本。花了相当多的时间和精力才发现有 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
这是对我们最终找到此信息的线程的引用,隐藏在线程的中途:.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 验证了我们的更改。
希望这会为其他人节省大量时间、精力和挫败感;)