SQL Server配置管理器中SSL证书在下拉菜单中缺失

31

我正在尝试配置SQL Server 2014以便可以使用SSL远程连接。服务器上安装了一个有效的通配符证书,该证书的域名(example.com)与服务器的FQDN(test.windows-server-test.example.com)相匹配。

问题是在SQL Server配置管理器中,证书未列出,因此我无法选择它。

空白下拉列表

也就是说,我卡在了这个微软教程的第2.e.2步骤上。


4
您导入的SSL证书可能存在问题,其 KeySpec 错误为 AT_SIGNATURE 而不是 AT_KEYEXCHANGE。您可以使用 certutil.exe -dump -v My.pfx 命令检查PFX文件,并搜索 KeySpec = 1 -- AT_KEYEXCHANGE。如果需要,在删除证书之前将其导出为PFX文件。然后,您可以使用 certutil.exe -v -importPFX My.pfx AT_KEYEXCHANGE 命令再次导入证书。 - Oleg
1
计算机证书存储中是否安装了证书?证书中的“CN”值是否与计算机(运行SQL服务器的完整DNS名称)的完整DNS名称相同?证书是否具有另一个“DNS名称”值的主题备用名称? - Oleg
证书已在IIS服务器证书中安装,并成功用于网站。证书适用于 *.example.com,计算机名称为 test.widows-server-test.example.com。这是你的意思吗? - Jonah
请查看 https://www.mssqltips.com/sqlservertip/3299/how-to-configure-ssl-encryption-in-sql-server/ 或者 https://msdn.microsoft.com/en-us/library/ms191192.aspx 中的“ SQL Server 证书要求”部分,您可以阅读到 “证书的名称必须是计算机的完全限定域名(FQDN)” - Oleg
1
"-KeySpec KeyExchange" 对我来说是个问题。(但我已经检查过主题与 SQL 服务器名称/FQDN 匹配) - Tilo
显示剩余3条评论
11个回答

30
在评论中的沟通后,我可以推测你主要的问题是你使用的证书中的CN部分。为了在IIS服务器上实现成功的TLS通信,没有像SQL Server那样有如此严格的限制。
微软要求(参见这里),证书名称必须是计算机的完全限定域名(FQDN)。这意味着证书的主题部分看起来像CN = test.widows-server-test.example.com,其中test.widows-server-test.example.com是您计算机的FQDN。仅使用例如CN = *.example.comSubject Alternative Name是不够的,该证书包含DNS Name=*.example.comDNS Name=test.widows-server-test.example.comDNS Name=test1.widows-server-test.example.comDNS Name=test.widows-server-test2.example.com等。这样的证书对于TLS来说是可以的,但是SQL Server会将其丢弃。请参见描述相关问题的文章
我建议您创建CN等于SQL Server的FQDN的自签名证书,并验证该证书是否能被SQL Server Configuration Manager看到。 更新:我使用进程监视器分析了问题,发现注册表中的两个值对于SQL Server配置管理器非常重要:HostnameDomain的值在以下密钥下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

如果我将DomainHostname更改为与证书CN相对应的值,则该证书将已在SQL Server配置管理器中显示。这可能不是所有问题,但它表明SQL Server需要更多作为Web服务器(例如IIS)。

更新2:我再次详细研究了一下问题,我认为我找到了一种方法可以配置您已经拥有的常见SSL证书(例如来自Let's EncryptStartSSL或其他某些类型的免费SSL证书)。

重要的是要区分SQL Server配置管理器所执行的操作与SQL Server所需的配置。配置管理器属性的证书选项卡具有比SQL Server更严格的限制。上面我描述了SQL Server配置管理器的限制,但是可以直接在注册表中进行配置以使用更常见的SSL / TLS证书通过SQL Server。下面我将介绍如何做到这一点。

要完成此操作,您需要在注册表中的一个键下,例如HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer\SuperSocketNetLib,其中MSSQL12.SQL2014部分在您的情况下可能略有不同。 SQL Server配置管理器帮助我们在注册表中设置两个值:ForceEncryptionCertificate

进入图像说明

Certificate值是可以通过检查证书属性找到的SHA1哈希值:

进入图像说明

或者是证书的扩展属性,您可以通过使用certutil.exe -store My来查看它们:

进入图像说明

您只需要复制“Cert Hash(sha1)”值,删除所有空格,并将其放置为注册表中Certificate值的值。进行设置并重新启动SQL Server Windows服务后,您将在C:\ Program Files \ Microsoft SQL Server \ ... \ MSSQL \ Log 目录中的ERRORLOG文件中看到类似于以下行:

2016-04-25 21:44:25.89 Server 证书[Cert Hash(sha1) "C261A7C38759A5AD96AC258B62A308A26DB525AA"]已成功加载以进行加密。


我刚刚尝试将“强制加密”设置为是,并且成功地从服务中重新启动了SQL Server。 ERRORLOG 中唯一可能相关的条目是:“已成功加载自动生成的证书以进行加密。”请注意,这不会引用我正在尝试加载的通配符证书,该证书不是自动生成的。我的当前问题与 OP 中相同:证书下拉菜单仍为空白。我无法选择要供 SQL Server 使用的证书。 - Jonah
澄清一下,我是说我没有创建自生成证书。通配符证书是由Komodo颁发的。 - Jonah
@Jonah:你应该打开证书并检查主题主题备用名称部分。主题部分应该有一个CN值,这个值必须与注册表中的Hostname.Domain相同。 - Oleg
@Jonah:你不能使用这样的证书用于SQL服务器。你可以在注册表中设置“Domain”等于“example.com”,但是你不能将“Hostname”设置为“*”。我认为你必须获得另一个SSL证书。你的服务器上有IIS吗?你的计算机的80和443端口可以从互联网访问吗?如果是,那么你可以从https://letsencrypt.org/ wining https://github.com/Lone-Coder/letsencrypt-win-simple/releases免费获取计算机的证书。 - Oleg
1
@Jonah:据我所知,所有证书都可以同时安装在证书存储中。这只是存储的问题。一个服务(或程序)可以使用一个证书,而另一个程序将使用另一个证书。例如,您可以配置IIS使用特定证书进行SSL。同一存储中存在其他证书并不重要。不应该存在任何冲突。 - Oleg
显示剩余12条评论

7
我想为将来可能遇到与我遇到的SQL 2016 SP2和故障转移群集类似问题的人添加以下内容。添加到注册表中的证书指纹必须全部大写。
希望这能帮助下一个人。

尽管SSCM生成的值是小写字母,但事实似乎是如此。奇迹永不停息。 - J Cracknell
经过Oleg的帮助,我的问题得到了解决,只需要将它转换为大写 - SQL Server 2016版本。 - Dany

3

即使按照上述步骤进行操作,我仍然遇到了问题。以下是我的解决方法:在证书管理控制台中,右键单击证书,选择“所有任务” -> “管理私钥”。将服务账户设为完全控制权限。在我的情况下,我正在使用NT Service\MSSQL$。


1
你只需要给予读取权限 - 这也解决了我的问题。 - Aidan
1
这正是我所需要的,需要点赞! - Adam Nofsinger

2
一旦我按照已接受答案的更新2部分中的步骤操作,就无法启动SQL Server服务,在事件查看器中出现以下错误:
无法加载用户指定的证书[Cert Hash(sha1) "thumbprint of certificate"]。服务器将不接受连接。您应该验证证书是否正确安装。请参阅“Books Online”中的“为SSL配置证书”。
TDSSNIClient初始化失败,错误代码为0x80092004,状态代码为0x80。原因:无法初始化SSL支持。找不到对象或属性。
TDSSNIClient初始化失败,错误代码为0x80092004,状态代码为0x1。原因:基础设施错误导致初始化失败。检查以前的错误。找不到对象或属性。
在SQL Server错误日志中出现错误:
服务器无法加载其需要启动SSL连接的证书。它返回以下错误:0x8009030d。检查证书以确保它们有效。
通过搜索发现解决方法
确保运行SQL Server服务的Windows帐户(在我的情况下为NT Service\MSSQLServer)对以下文件夹/注册表项具有完全权限:
1. C:\Program Files\Microsoft SQL Server[Your Sql Server Instance]\MSSQL\ 2. C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 3. HKLM\System\CurrentControlSet\Services\WinSock2\Parameters
我检查了第1点,NT Service\MSSQLSERVER已经拥有权限。
我检查了第2点,NT Service\MSSQLSERVER没有权限,我添加了权限。它弹出一个错误,说该文件夹中的一个文件被拒绝操作,但我只是忽略了它(别无选择)。
我没有检查第3点并尝试启动SQL Server,它起作用了!!

1

我在SSRS中遇到了类似的问题,微软活动目录CA颁发的证书在SSRS下拉菜单中不可见。经过大量搜索、试验和错误,我通过遵循这个链接解决了这个问题。

https://learn.microsoft.com/en-us/archive/blogs/sqlserverfaq/can-tls-certificate-be-used-for-sql-server-encryption-on-the-wire

下面是简要内容概述: 证书的Subject属性必须表明通用名称(CN)与服务器计算机的主机名或完全限定域名(FQDN)相同。
因此,在我们的情况下,我们建议请求证书颁发机构将主题名称更改为ABC-SQLServer.abc.local(SQL Server的FQDN),而不是abc-corp.abc.com。完成此更改后,我们再次在MMC中加载证书,现在我们可以在SQL Server配置管理器中看到已加载的证书!希望对有同样问题的人有所帮助!

1

SQL Server 2019

我发现证书指纹必须以小写形式输入到证书注册表键中,Configuration Manager才能看到它。

SQL Server将读取注册表值并使用它,无论注册表键是大写还是小写。但是,只有当它以小写形式出现时,配置管理器才会显示它。


对于 SQL Server 2019,将其更改为小写后,它确实会显示在 SQL Server Configuration Manager 中,这似乎有些奇怪并且看起来矛盾。 - user1655072

0

我使用SQL Server域帐户登录服务器(必须将该帐户暂时添加到本地管理员组),并将证书导入SQL Server服务帐户的个人文件夹中。重启服务器,然后SQL Server就可以看到证书了。希望对某些人有所帮助。


0
一个额外的故障模式是密钥长度- SQL需要最小密钥长度为2048。禁用DH通道后。

0
我的问题是证书存储是为WebHosting而设计的,但要在SSRS中查看证书,则必须将其设置为个人证书。

IIS Server Certificate list example


如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - Reza Heidari

0

我也遇到了一个问题,就像这里文章中详细描述的那样,从MMC中复制出来。使用certutil并将其复制到注册表值中完美解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接