SQL Server 配置管理器的下拉列表中缺少 SSL 证书

Posted

技术标签:

【中文标题】SQL Server 配置管理器的下拉列表中缺少 SSL 证书【英文标题】:SSL Certificate missing from dropdown in SQL Server Configuration Manager 【发布时间】:2016-08-17 11:45:06 【问题描述】:

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

问题是在 SQL Server 配置管理器中,证书没有列出,所以我无法选择它。

也就是说,我被困在this MS tutorial 的第 2.e.2 步。

【问题讨论】:

可能是您导入的 SSL 证书的 KeySpec 错误:AT_SIGNATURE 而不是 AT_KEYEXCHANGE。您可以使用 certutil.exe -dump -v My.pfx 检查 PFX 并搜索 KeySpec = 1 -- AT_KEYEXCHANGE。您可以删除证书(如果您尚未将其作为 PFX 将其导出到 PFX)并使用 certutil.exe -v -importPFX My.pfx AT_KEYEXCHANGE 再次导入它 谢谢,我查过了,但我有KeySpec = 1 -- AT_KEYEXCHANGE 计算机证书存储中是否安装了证书?证书中的CN 值是否与计算机的完整 DNS 名称(运行 SQL 服务器的位置)相同?证书是否具有带有“DNS 名称”值的主题备用名称? 证书已安装在 IIS 服务器证书中,并已成功用于网站。证书用于*.example.com,计算机名称为test.widows-server-test.example.com。是这个意思吗? -KeySpec KeyExchange 对我来说是个问题。 (但我已经检查了主题与 SQL 服务器名称/FQDN 是否匹配) 【参考方案1】:

在 cmets 中通信后,我可以假设您的主要问题是您使用的证书的 CN 部分。要让 IIS 服务器成功进行 TLS 通信,没有 SQL Server 那样严格的限制。

Microsoft 要求(请参阅here)证书的名称必须是计算机的完全限定域名 (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.com、@987654335 @ 等等。这样的证书对于 TLS 来说是可以的,但 SQL Server 会丢弃它。请参阅the article,它描述了关闭的问题。

我建议您创建 CN 等于 SQL Server 的 FQDN 的自签名证书,并验证 SQL Server 配置管理器是否可以看到该证书。

更新:我对进程监视器的问题进行了更多分析,发现注册表中的两个值对于 SQL Server 配置管理器很重要:值 HostnameDomain 下关键

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

更新 2: 我再次详细检查了该问题,我想我确实找到了如何配置您已经拥有的通用 SSL 证书的方法(例如来自Let's Encrypt 的免费 SSL 证书,StartSSL 或其他)。

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

您可以在注册表中的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 服务器证书 [Cert Hash(sha1) "C261A7C38759A5AD96AC258B62A308A26DB525AA"] 加载成功 用于加密。

【讨论】:

谢谢,因为warning here,所以我将计算机名称更改为“test.example.com”,现在在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 中,域都是“example.com”,主机名是“test ”。证书仍然没有出现。我手动将主机名更改为“example.com”,但证书仍未显示。我错过了一步吗? @Jonah:您是否在 SQL Server 配置管理器中将“强制加密”设置为“是”?您是否重新启动了 SQL Server?可以重新启动 SQL Server 吗?您能在 SQL ERRORLOG 中看到类似“证书 [Cert Hash(sha1) ... ] 已成功加载以进行加密。”之类的内容吗?你目前到底有什么问题?你有哪条错误信息? 我刚刚尝试将“强制加密”设置为“是”,并且成功地从服务重新启动了 SQL Server。 ERRORLOG 中唯一可能相关的条目是:A self-generated certificate was successfully loaded for encryption. 注意,这将 not 引用我正在尝试加载的通配符证书,它不是自行生成的。我当前的问题与 OP 中的相同:证书下拉列表仍然是空白的。我无法选择供 SQL Server 使用的证书。 @Jonah:抱歉,您应该发布证书的详细信息。如果您创建了一个自行生成的证书,那么究竟是如何创建的,哪些属性,您安装它的位置(在哪个证书存储中)等等。 @Jonah:我知道可以在证书存储中同时安装所有证书。这只是商店。一个服务(或程序)可以使用一个证书,而另一个程序将使用另一个证书。例如,您可以配置 IIS 以使用 SSL 的 特定 证书。同一商店中是否存在任何其他证书并不重要。不应该存在冲突。【参考方案2】:

我想为将来可能会偶然发现我在 SQL 2016 SP2 和故障转移集群中遇到的类似问题的人添加此内容。添加到注册表的证书指纹必须全部大写。

希望这对下一个人有所帮助。

【讨论】:

尽管 SSCM 生成的值是小写的,但情况似乎如此。奇迹永远不会停止。【参考方案3】:

按照已接受答案的更新 2 部分中的步骤操作后,我无法启动 SQL Server 服务,在事件查看器中出现这些错误:

无法加载用户指定的证书 [Cert Hash(sha1) "thumbprint of certificate"]。服务器将不接受连接。您应该验证证书是否已正确安装。请参阅联机丛书中的“配置证书以供 SSL 使用”。

TDSSNIClient 初始化失败,错误为 0x80092004,状态代码为 0x80。原因:无法初始化 SSL 支持。找不到对象或属性。

TDSSNIClient 初始化失败,错误为 0x80092004,状态代码 0x1。原因:初始化因基础结构错误而失败。检查以前的错误。找不到对象或属性。

在 SQL Server 错误日志中出现错误:

服务器无法加载启动 SSL 连接所需的证书。它返回以下错误:0x8009030d。检查证书以确保它们有效。

google了一下,发现a solution:

确保运行 SQL Server 服务的 Windows 帐户(在我的情况下为 NT Service\MSSQLServer)对以下文件夹/注册条目具有完全权限:

    C:\Program Files\Microsoft SQL Server[您的 Sql Server 实例]\MSSQL\ C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys HKLM\System\CurrentControlSet\Services\WinSock2\Parameters

我查了1号NT Service\MSSQLSERVER已经有权限了。

我检查了2号,NT Service\MSSQLSERVER没有权限,我添加了权限。它弹出一个错误,说该文件夹中的一个文件被拒绝操作,但我只是忽略了它(我无能为力)

我没有检查No.3并尝试启动SQL Server,它成功了!!

【讨论】:

【参考方案4】:

我在 s-s-rS 中遇到了类似的问题,其中 microsoft Active Directory CA 颁发的证书在 s-s-rS 的下拉列表中不可见。经过大量搜索、反复试验,我可以通过点击此链接修复它。

https://docs.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 配置管理器中看到加载的证书!

希望它可以帮助面临同样问题的人!

【讨论】:

【参考方案5】:

即使按照上述操作,我仍然遇到问题。这是我的修复: 在证书 mmc 中右键单击证书所有任务-> 管理私钥。让服务帐户完全控制。就我而言,我使用的是 NT Service\MSSQL$

【讨论】:

您只需要授予读取权限 - 这也解决了我的问题。 这也是我需要的,需要点赞!【参考方案6】:

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

【讨论】:

【参考方案7】:

另一种故障模式是密钥长度 - SQL 要求的最小密钥长度为 2048。禁用 DH 通道。

【讨论】:

【参考方案8】:

我也遇到了从 MMC 复制的问题,如文章 here 中所述。使用 certutil 并将其复制到注册表值中效果很好。

【讨论】:

以上是关于SQL Server 配置管理器的下拉列表中缺少 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

V18.5 中缺少 SQL Server 配置管理器

配置管理器的SQL Server服务器里只有SQLEXPERSS,没有MSSQLSERVER,无法连接数据库

SQL Server配置管理器的“别名”功能好处,实现内外网统一以及加了端口号导致的限制

为啥 SQL Server Management Studio 2008 的服务器类型列表中缺少 SQL Server Compact Edition?

从 sql server 获取选定的值到 php 中的下拉列表

为啥启动sql server 配置管理器出现请求失败或服务未及时响应