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-10-14 09:58:28.66 Server Error: 17182, Severity: 16, State: 1. |
这类问题一般都是由于证书不合法,或者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会因为无法读取私钥而认为证书不合法。