SQL 服务器配置管理器的下拉列表中缺少 SSL 证书
SSL Certificate missing from dropdown in SQL Server Configuration Manager
我正在尝试配置 SQL Server 2014,以便我可以使用 SSL 远程连接到它。服务器上安装了有效的通配符证书,并且证书的域名 (example.com) 与服务器的 FQDN (test.windows-server-test.example.com).
匹配
问题是 SQL 服务器配置管理器中没有列出证书,所以我无法 select 它。
也就是说,我卡在了 this MS tutorial 的第 2.e.2 步。
在评论中交流后,我可以假设您的主要问题是您使用的证书的 CN 部分。要为 IIS 服务器成功进行 TLS 通信,没有像 SQL 服务器那样的严格限制。
Microsoft 要求(参见 here) that The name of the certificate must be the fully qualified domain name (FQDN) of the computer. It means that the Subject part of the certificate looks like CN = test.widows-server-test.example.com, where test.widows-server-test.example.com is the FQDN of your computer. It's not enough that you use for example CN = *.example.com and Subject Alternative Name, which contains DNS Name=*.example.com
and DNS Name=test.widows-server-test.example.com
, DNS Name=test1.widows-server-test.example.com
, DNS Name=test.widows-server-test2.example.com
and so on. Such certificate will be OK for TLS, but SQL Server will discard it. See the article,它描述了关闭问题。
我建议您创建 self-signed 证书,其 CN 等于 SQL 服务器的 FQDN,并验证 SQL 服务器配置管理器可以看到该证书。
已更新:我对进程监视器的问题进行了更多分析,发现注册表中的两个值对 SQL 服务器配置管理器很重要:键
下的值 Hostname
和 Domain
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
如果我将 Domain
和 Hostname
更改为与证书的 CN 对应的值,那么证书将已经显示在 SQL 服务器配置管理器中。这可能不是所有问题,但它表明 SQL 服务器需要更多作为 Web 服务器(例如 IIS)。
更新 2: 我再次详细检查了这个问题,我想我确实找到了如何配置你已经拥有的通用 SSL 证书的方法(例如免费的 SSL由 Let's Encrypt, StartSSL 或其他人认证。
区分 SQL 服务器配置管理器 和 SQL 服务器所需的配置很重要。 Configuration Manager 属性的“证书”选项卡与 SQL 服务器相比,有 更多硬性限制。上面我只描述了SQL Server Configuration Manager 的限制,但是可以直接在Registry 中进行配置,使用SQL Server 使用更常见的SSL/TLS Certificate。我在下面描述了如何做到这一点。
需要做什么可以在注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer\SuperSocketNetLib
项下进行,其中 MSSQL12.SQL2014
部分可能与您的情况略有不同。 SQL 服务器配置管理器帮助我们在注册表中设置两个值:ForceEncryption
和 Certificate
:
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 The certificate [Cert Hash(sha1)
"C261A7C38759A5AD96AC258B62A308A26DB525AA"] was successfully loaded
for encryption.
我想为将来可能偶然发现我在 SQL 2016 SP2 和故障转移群集中遇到的类似问题的人添加此内容。添加到注册表的证书指纹必须全部大写。
希望这对下一个人有所帮助。
我使用SQL服务器域帐户登录服务器(必须临时将帐户添加到本地管理员)并将证书导入SQL服务器服务帐户的个人文件夹中。重新启动服务器,然后 SQL 服务器可以看到证书。希望它能帮助别人。
另一个失败模式是密钥长度 - SQL 要求最小密钥长度为 2048。禁用 DH 通道。
按照已接受答案的更新 2 部分中的步骤进行操作后,我无法启动 SQL 服务器服务,在事件查看器中出现这些错误:
Unable to load user-specified certificate [Cert Hash(sha1) "thumbprint of certificate"]. The server will not accept a connection. You should verify that the certificate is correctly installed. See "Configuring Certificate for Use by SSL" in Books Online.
TDSSNIClient initialization failed with error 0x80092004, status code 0x80. Reason: Unable to initialize SSL support. Cannot find object or property.
TDSSNIClient initialization failed with error 0x80092004, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. Cannot find object or property.
在 SQL 服务器错误日志中出现错误:
The server could not load the certificate it needs to initiate an SSL connection. It returned the following error: 0x8009030d. Check certificates to make sure they are valid.
用谷歌搜索发现 a solution:
确保 windows 帐户 运行 SQL 服务器服务(NT Service\MSSQLServer
在我的例子中)对以下 folders/register 条目具有完全权限:
- C:\Program Files\Microsoft SQL Server[你的 Sql 服务器实例]\MSSQL\
- C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
- HKLM\System\CurrentControlSet\Services\WinSock2\Parameters
我查了1号NT Service\MSSQLSERVER
已经有权限
我查了2号,NT Service\MSSQLSERVER
没有权限,我加了权限。它弹出一个错误,说该文件夹中的一个文件被拒绝操作,但我只是忽略它(我无能为力)
我没有检查 3 号并尝试启动 SQL 服务器,成功了!!
我也 运行 遇到了从 MMC 中复制出来的问题,详见文章 here。使用 certutil 并将其复制到注册表值中效果很好。
我在 SSRS 中遇到了类似的问题,其中微软活动目录 CA 颁发的证书在 SSRS 的下拉列表中不可见。经过大量搜索、反复试验后,我可以按照 link.
来修复它
简述如下:
证书的 Subject 属性 必须表明公用名 (CN) 与主机名或 完全限定域名 (FQDN) 服务器计算机。
因此在我们的案例中,我们建议请求证书颁发机构将主题名称更改为 ABC-SQLServer.abc.local(SQL 服务器的 FQDN)而不是 abc-corp.abc.com
完成此更改后,我们再次在 MMC 中加载证书,现在我们可以在 SQL 服务器配置管理器中看到加载的证书!
希望对遇到同样问题的人有所帮助!
即使按照上述操作,我仍然遇到问题。这是我的修复:
在证书 mmc 中,右键单击证书所有任务-> 管理 Pricate 密钥。授予服务帐户完全控制权。就我而言,我使用的是 NT Service\MSSQL$
在注册表编辑器中为证书使用大写 LOL
配置管理器中仍未显示,但 TLS 正在为 SQL 个连接工作。
我的问题是 Certificate Store 用于 WebHosting
,但要在 SSRS 中查看证书,它必须是个人的。
我正在尝试配置 SQL Server 2014,以便我可以使用 SSL 远程连接到它。服务器上安装了有效的通配符证书,并且证书的域名 (example.com) 与服务器的 FQDN (test.windows-server-test.example.com).
匹配问题是 SQL 服务器配置管理器中没有列出证书,所以我无法 select 它。
也就是说,我卡在了 this MS tutorial 的第 2.e.2 步。
在评论中交流后,我可以假设您的主要问题是您使用的证书的 CN 部分。要为 IIS 服务器成功进行 TLS 通信,没有像 SQL 服务器那样的严格限制。
Microsoft 要求(参见 here) that The name of the certificate must be the fully qualified domain name (FQDN) of the computer. It means that the Subject part of the certificate looks like CN = test.widows-server-test.example.com, where test.widows-server-test.example.com is the FQDN of your computer. It's not enough that you use for example CN = *.example.com and Subject Alternative Name, which contains DNS Name=*.example.com
and DNS Name=test.widows-server-test.example.com
, DNS Name=test1.widows-server-test.example.com
, DNS Name=test.widows-server-test2.example.com
and so on. Such certificate will be OK for TLS, but SQL Server will discard it. See the article,它描述了关闭问题。
我建议您创建 self-signed 证书,其 CN 等于 SQL 服务器的 FQDN,并验证 SQL 服务器配置管理器可以看到该证书。
已更新:我对进程监视器的问题进行了更多分析,发现注册表中的两个值对 SQL 服务器配置管理器很重要:键
下的值Hostname
和 Domain
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
如果我将 Domain
和 Hostname
更改为与证书的 CN 对应的值,那么证书将已经显示在 SQL 服务器配置管理器中。这可能不是所有问题,但它表明 SQL 服务器需要更多作为 Web 服务器(例如 IIS)。
更新 2: 我再次详细检查了这个问题,我想我确实找到了如何配置你已经拥有的通用 SSL 证书的方法(例如免费的 SSL由 Let's Encrypt, StartSSL 或其他人认证。
区分 SQL 服务器配置管理器 和 SQL 服务器所需的配置很重要。 Configuration Manager 属性的“证书”选项卡与 SQL 服务器相比,有 更多硬性限制。上面我只描述了SQL Server Configuration Manager 的限制,但是可以直接在Registry 中进行配置,使用SQL Server 使用更常见的SSL/TLS Certificate。我在下面描述了如何做到这一点。
需要做什么可以在注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer\SuperSocketNetLib
项下进行,其中 MSSQL12.SQL2014
部分可能与您的情况略有不同。 SQL 服务器配置管理器帮助我们在注册表中设置两个值:ForceEncryption
和 Certificate
:
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 The certificate [Cert Hash(sha1) "C261A7C38759A5AD96AC258B62A308A26DB525AA"] was successfully loaded for encryption.
我想为将来可能偶然发现我在 SQL 2016 SP2 和故障转移群集中遇到的类似问题的人添加此内容。添加到注册表的证书指纹必须全部大写。
希望这对下一个人有所帮助。
我使用SQL服务器域帐户登录服务器(必须临时将帐户添加到本地管理员)并将证书导入SQL服务器服务帐户的个人文件夹中。重新启动服务器,然后 SQL 服务器可以看到证书。希望它能帮助别人。
另一个失败模式是密钥长度 - SQL 要求最小密钥长度为 2048。禁用 DH 通道。
按照已接受答案的更新 2 部分中的步骤进行操作后,我无法启动 SQL 服务器服务,在事件查看器中出现这些错误:
Unable to load user-specified certificate [Cert Hash(sha1) "thumbprint of certificate"]. The server will not accept a connection. You should verify that the certificate is correctly installed. See "Configuring Certificate for Use by SSL" in Books Online.
TDSSNIClient initialization failed with error 0x80092004, status code 0x80. Reason: Unable to initialize SSL support. Cannot find object or property.
TDSSNIClient initialization failed with error 0x80092004, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. Cannot find object or property.
在 SQL 服务器错误日志中出现错误:
The server could not load the certificate it needs to initiate an SSL connection. It returned the following error: 0x8009030d. Check certificates to make sure they are valid.
用谷歌搜索发现 a solution:
确保 windows 帐户 运行 SQL 服务器服务(NT Service\MSSQLServer
在我的例子中)对以下 folders/register 条目具有完全权限:
- C:\Program Files\Microsoft SQL Server[你的 Sql 服务器实例]\MSSQL\
- C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
- HKLM\System\CurrentControlSet\Services\WinSock2\Parameters
我查了1号NT Service\MSSQLSERVER
已经有权限
我查了2号,NT Service\MSSQLSERVER
没有权限,我加了权限。它弹出一个错误,说该文件夹中的一个文件被拒绝操作,但我只是忽略它(我无能为力)
我没有检查 3 号并尝试启动 SQL 服务器,成功了!!
我也 运行 遇到了从 MMC 中复制出来的问题,详见文章 here。使用 certutil 并将其复制到注册表值中效果很好。
我在 SSRS 中遇到了类似的问题,其中微软活动目录 CA 颁发的证书在 SSRS 的下拉列表中不可见。经过大量搜索、反复试验后,我可以按照 link.
来修复它简述如下: 证书的 Subject 属性 必须表明公用名 (CN) 与主机名或 完全限定域名 (FQDN) 服务器计算机。
因此在我们的案例中,我们建议请求证书颁发机构将主题名称更改为 ABC-SQLServer.abc.local(SQL 服务器的 FQDN)而不是 abc-corp.abc.com 完成此更改后,我们再次在 MMC 中加载证书,现在我们可以在 SQL 服务器配置管理器中看到加载的证书!
希望对遇到同样问题的人有所帮助!
即使按照上述操作,我仍然遇到问题。这是我的修复: 在证书 mmc 中,右键单击证书所有任务-> 管理 Pricate 密钥。授予服务帐户完全控制权。就我而言,我使用的是 NT Service\MSSQL$
在注册表编辑器中为证书使用大写 LOL 配置管理器中仍未显示,但 TLS 正在为 SQL 个连接工作。
我的问题是 Certificate Store 用于 WebHosting
,但要在 SSRS 中查看证书,它必须是个人的。