AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 213608
Accepted
jyao
jyao
Asked: 2018-07-31 12:27:28 +0800 CST2018-07-31 12:27:28 +0800 CST 2018-07-31 12:27:28 +0800 CST

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

  • 772

我被这个问题困扰了将近 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,如下所示

在此处输入图像描述

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

sql-server sql-server-2016
  • 4 4 个回答
  • 34229 Views

4 个回答

  • Voted
  1. Zeek
    2019-03-28T04:18:44+08:002019-03-28T04:18:44+08:00

    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 验证了我们的更改。

    希望这将为其他人节省大量时间、精力和挫败感;)

    • 29
  2. Best Answer
    jyao
    2018-08-10T08:04:56+08:002018-08-10T08:04:56+08:00

    由于似乎没有人能回答这个问题,我向 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。

    • 5
  3. Alberto Martinez
    2018-10-29T13:20:03+08:002018-10-29T13:20:03+08:00

    这很奇怪,因为链接的文章清楚地指出:

    支持 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  
    

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

    但是在您提供的我只看到的屏幕截图中,"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,但我不确定这个。

    • 5
  4. ema
    2021-11-23T13:44:50+08:002021-11-23T13:44:50+08:00
    • 几周前,我们在 SQLServer 数据库邮件中遇到了类似的问题。我们在 Azure 中使用 office365 SMTP 服务器。

    配置为“Windows 2012R2 + SQLServer 2012”和“Windows 2012R2 + SQLServer 2014”。

    数据库邮件上的错误是“由于电子邮件服务器错误,无法将邮件发送给收件人”。

    错误不是系统的。我们假设当我们到达一个允许 TLS1.0 的天蓝色端点时,电子邮件发送良好,但是当我们到达一个使用 TLS1.2 的端点时,我们的电子邮件被拒绝。

    • 如果我们分析数据库邮件发送的电子邮件标头,我们可以看到 SMTP 服务器使用 TLS1.2,但数据库邮件使用 TLS1.0 协议发送电子邮件。
    Microsoft SMTP Server (version=TLS1_2,...)
    Received: from ... with Microsoft SMTP Server (version=TLS1_0, ...
    
    • 我们通过在每台服务器上添加以下注册表项来解决问题(Powershell 脚本)
    #TLS1.2 configure strong encryption
    #The strong cryptography uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure.
    #64 bits applications
    New-ItemProperty -Path "HKLM:\Software\Microsoft\.NETFramework\v2.0.50727" -Name "SchUseStrongCrypto" -Value ”1”  -PropertyType "dword";
    New-ItemProperty -Path "HKLM:\Software\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value ”1”  -PropertyType "dword";
    
    
    #32 bits applications
    New-ItemProperty -Path "HKLM:\Software\WOW6432Node\Microsoft\.NETFramework\v2.0.50727" -Name "SchUseStrongCrypto" -Value ”1”  -PropertyType "dword";
    New-ItemProperty -Path "HKLM:\Software\WOW6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value ”1”  -PropertyType "dword";
    
    
    
    #SystemDefaultTlsVersions
    #A value of 1 causes your app to allow the operating system to choose the protocol
    New-ItemProperty -Path "HKLM:\Software\Microsoft\.NETFramework\v2.0.50727" -Name "SystemDefaultTlsVersions" -Value ”1”  -PropertyType "dword";
    New-ItemProperty -Path "HKLM:\Software\Microsoft\.NETFramework\v4.0.30319" -Name "SystemDefaultTlsVersions" -Value ”1”  -PropertyType "dword";
    
    
    #32 bits applications
    New-ItemProperty -Path "HKLM:\Software\WOW6432Node\Microsoft\.NETFramework\v2.0.50727" -Name "SystemDefaultTlsVersions" -Value ”1”  -PropertyType "dword";
    New-ItemProperty -Path "HKLM:\Software\WOW6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SystemDefaultTlsVersions" -Value ”1”  -PropertyType "dword"; 
    
    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve