我被这个问题困扰了将近 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,如下所示
详细信息来自此链接(请参阅常见问题解答部分)
TLS1.2 是目前唯一被认为是安全的 TLS 版本(2019 年 3 月)。花费了相当多的时间和精力才发现有 2 个基本的附加设置需要这些设置才能正常工作,这些设置在 Microsoft 或 Web 上通常不为人所知,也没有很好的文档记录。 以下可以为您节省大量的时间和精力。
这些是为我们解决问题的 2 个新注册表设置:
这是对我们最终找到此信息的线程的引用,隐藏在线程的中途:.NET Framework 4.0 中的 TLS 1.2
下面是我放在一起的一个简单的可执行注册表文件的内容,它将进行 2 个新设置和上面线程中已经显示的设置(即,这会生成所有必要的注册表设置*):
注意 1:需要重启 SQL 才能使这些设置生效,但最好重启 Windows,因为新设置通常会影响 .NET 4.x。
注意 2:在 SQL 中,必须在邮件配置文件中勾选 SSL 复选框才能使用 TLS1.2。
*注 3:仅供参考,我们运行了免费工具 Crypto V2,并在开始运行之前启用了“最佳实践”选项。之后我们使用新的 Crypto 版本 3 验证了我们的更改。
希望这将为其他人节省大量时间、精力和挫败感;)
由于似乎没有人能回答这个问题,我向 Microsoft 开了一个支持案例,但 MS 支持仍然花了将近 1 周的时间才得到答案,因为他通过各种内部资源得到了明确的答案。
总结是:
这很奇怪,因为链接的文章清楚地指出:
这与您从 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 时错过了一个注册表项。常见问题解答部分说:
但是在您提供的我只看到的屏幕截图中,
"Enabled"=dword:00000001
缺少"DisabledByDefault"=dword:00000000
密钥。它还说:
这可以解释为您需要禁用TLS 1.0 和 1.1 才能使用 1.2,但我不确定这个。
配置为“Windows 2012R2 + SQLServer 2012”和“Windows 2012R2 + SQLServer 2014”。
数据库邮件上的错误是“由于电子邮件服务器错误,无法将邮件发送给收件人”。
错误不是系统的。我们假设当我们到达一个允许 TLS1.0 的天蓝色端点时,电子邮件发送良好,但是当我们到达一个使用 TLS1.2 的端点时,我们的电子邮件被拒绝。