证书引起SQL Server无法启动的Troubleshooting

SQL Server不能启动的原因是多种多样的。其中也可能由于证书配置的不恰当造成SQL Server无法启动。在这里我们介绍一些针对这类问题的troubleshooting手段。

 

如果判断SQL Server无法启动和证书有关


SQL Server无法启动的原因多种多样,那么如何确定是和证书相关的呢?最直接的方法是先了解下这个SQL Server实例是否配置过或者曾经手动配置过证书。如果没有手动配置过证书的话,SQL Server是使用自动生成的自签名证书的,而自签名证书一般不会造成启动问题。因此由证书造成的启动问题一般都是由于手动配置过证书造成的。

其次,我们最好检查一下SQL Server的Error log,来确认是否是证书问题。Error log一般位于Microsoft SQL Server\MSSQL.1\MSSQL\Log目录下。用写字板打开后,如果在末尾部分你看到类似如下两种错误中的其中一种的话,就基本可以判定是和证书相关的问题。

 

2010-06-28 17:40:47.72 server Encryption requested but no valid certificate was found. SQL Server terminating. 2010-06-28 17:40:47.72 server Error: 17826, Severity: 18, State: 1 2010-06-28 17:40:47.72 server Could not set up Net-Library 'SSNETLIB'.. 2010-06-28 17:40:47.72 server Unable to load any netlibs. 2010-06-28 17:40:47.72 server SQL Server could not spawn FRunCM thread.

 

2010-10-14 09:58:28.66 Server Error: 17182, Severity: 16, State: 1. 2010-10-14 09:58:28.66 Server TDSSNIClient initialization failed with error 0xe, status code 0xa. 2010-10-14 09:58:28.66 Server Error: 17182, Severity: 16, State: 1. 2010-10-14 09:58:28.66 Server TDSSNIClient initialization failed with error 0xe, status code 0x1. 2010-10-14 09:58:28.66 Server Error: 17826, Severity: 18, State: 3. 2010-10-14 09:58:28.66 Server Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log. 2010-10-14 09:58:28.66 Server Error: 17120, Severity: 16, State: 1. 2010-10-14 09:58:28.66 Server SQL Server could not spawn FRunCM thread. Check the SQL Server error log and the Windows event logs for information about possible related problems.

 

这类问题一般都是由于证书不合法,或者SQL Server无法访问指定的证书做成的。

快速解决问题


为了使SQL Server可以快速启动起来,最快的方法是先让SQL Server使用自动生成的证书先启动起来。然后再慢慢去检查证书存在的问题。

为了使用自生成证书,我们需要打开注册表编辑器,找到以下注册表(根据实例的序号不同,注册表路径可能稍有不同):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Certificate

然后把Certificate的值清空。然后,打开MMC,添加证书管理控制台,将所有位于Local Computer certificate store和Current User certificate store中所有subject栏和服务器主机名一样的证书都删除(删除前可以先讲证书导出做备份,以备将来使用)。这样,通常情况下SQL Server就可以开始使用自生成的证书。

有时候也会发生虽然已经把证书清楚了,但是SQL Server仍旧无法启动而且仍旧报出上述的错误。这个时候,为了尽快把SQL Server启动起来,我们可以自己手动生成一个自签名的证书来给SQL Server使用。你可以使用Makecert.exe工具或者使用SelfSSL工具来制作自签名的证书。如果你对怎么使用这些工具不熟悉的话,可以参考这篇文章

无法启动的原因多种多样,那么如何确定是和证书相关的呢?最直接的方法是先了解下这个SQL Server实例是否配置过或者曾经手动配置过证书。如果没有手动配置过证书的话,SQL Server是使用自动生成的自签名证书的,而自签名证书一般不会造成启动问题。因此由证书造成的启动问题一般都是由于手动配置过证书造成的。

 

检查证书的问题


SQL Server对它可以使用的证书是有一定要求的。很多情况下,你给SQL Server使用的证书都是第三方颁布的,因此该证书可能并不能给SQL Server使用。前面也提到过了,证书造成SQL Server无法启动一般是因为:

1. 证书不符合SQL Server的要求。

2. SQL Server无法访问到指定的证书。

这种情况下,你可以使用如下步骤来检查证书。

  • 本机的当前系统时间应该在大于证书的 Valid from 属性,小于证书的 Valid to属性.

  • 该证书必须要用于 server authentication。因此证书的 Enhanced Key Usage 属性要设置为 Server Authentication (1.3.6.1.5.5.7.3.1).
  • 证书的KEY_USAGE属性必须包含key encipherment .

 

  • 通常情况下证书的 Subject属性的(common name)CN域需要和服务器的主机名或者fully qualified domain name (FQDN)一样。如果SQL Server是群集的话,则CN域一定要和SQL Server的虚拟网络名或FQDN相同,并且证书在所有节点上都存在。
  • 如果SQL Server的启动账号是本机管理员的话,则证书可以存放在local computer certificate store。如果SQL Server启动账户不是管理员的话,就需要把证书放置在SQL Server启动账户对应的Current user certificate store中。否则SQL Server就会无法读取证书。
  • 确保证书是包含私钥的。
  • 证书的thumbprint如果包含连续的两个0,而你又是使用设置certificate注册表键值的方法来指定证书的话,SQL Server错误的截断certificate的值,进而会找不到这个证书。
  • 当将证书导入到certificate store时,”Enable strong private key protection”选项要确保是关闭的。否则SQL Server会因为无法读取私钥而认为证书不合法。