将服务器配置为使用 SSL 时,SQL Server 无法启动
本文提供了错误 17182(TDSSNIClient 初始化失败并出现错误0xd、状态代码0x38)的解决方法,该错误在服务器配置为使用 SSL 时发生。
适用范围:SQL Server
原始 KB 数: 2023869
现象
假设出现了下面这种情景:
你有一个 SQL Server 2005 或更高版本的实例,该实例托管在运行 Windows Server 2008 或更高版本操作系统的系统上。
你已为 SQL Server 配置 SSL 加密,方法是将证书的指纹手动输入到以下注册表项下的“证书”值:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
在这种情况下,SQL Server 可能无法启动,并且 SQL Server Errorlog 中记录了以下消息:
<Datetime> 服务器错误:17182,严重性:16,状态:1。
<Datetime> 服务器 TDSSNIClient 初始化失败,错误0xd,状态代码0x38。
<Datetime> 服务器错误:17182,严重性:16,状态:1。 <Datetime> 服务器 TDSSNIClient 初始化失败,出现错误0xd,状态代码0x1。
<Datetime> 服务器错误:17826,严重性:18,状态:3。
<由于网络库中出现内部错误,Datetime> 服务器无法启动网络库。 要确定原因,请查看错误日志中紧位于此错误之前的那些错误。
<Datetime> 服务器错误:17120,严重性:16,状态:1。
<Datetime> Server SQL Server 无法生成 FRunCM 线程。 请检查 SQL Server 错误日志和 Windows 事件日志,以获取有关可能的相关问题的信息。
原因
这些症状的常见根本原因是一个不可见的字符,在从 MMC 中的“证书”管理单元的丰富编辑控件中复制出来时,该字符可能无意中被添加到证书的指纹值中。
解决方法
可以使用以下任一解决方法:
复制证书的指纹值时,请避免从 MMC 中的“证书”管理单元复制前导字符。
使用 Certutil 工具(而不是 MMC 中的证书管理单元)将证书导出到文本文件,然后从文本文件复制所需证书的指纹值。 使用情况如下所示:
若要查看计算机的当前用户证书存储的内容,请在命令提示符处键入以下内容:
certutil -store -user my
若要查看计算机的本地计算机证书存储的内容,请在命令提示符处键入以下内容:
certutil -store my
在基于 Vista 的操作系统的管理命令提示符下,可以使用以下命令将上述命令的输出定向到文本文件:
certutil -store my > cert.txt
指纹可以位于以证书哈希开头的行中(sha1)
例如:证书哈希(sha1): e7 02 4b 42 c4 04 fd 44 8c ec 21 f1 91 76 5c b7 c3 ad 1d 55
然后,可以将此值(不含空格 )复制到以下注册表项下的证书值:对于上述示例,此值将为 e7024b404fd448cec21f191765cb7c3ad1d55:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
详细信息
错误消息 17182 中的状态代码 0x38 意味着 SQL Server 在 SSL 初始化期间遇到错误。 有关更多详细信息,请参阅 SQL 协议 。
返回代码0xd表示 OS 错误0xd(13),该错误转换为“数据无效”,上述错误 17182“TDSSNIClient 初始化失败,错误0xd,状态代码0x38”,具体是因为证书值下的字符串无法正确转换为证书的有效指纹。
旧版 Windows(例如 Windows XP、Windows Server 2003)上不会发生证书管理单元的此 GUI 问题,因为它们不使用证书管理单元中的丰富编辑控件
若要检查是否遇到本文中所述的问题,可以使用以下过程:
打开 regedit 并导航到以下注册表项,并将密钥导出到SSLKey.reg文件:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
使用记事本和“文件”菜单中的“另存为”对话框打开步骤 1 中的SSLKey.reg文件,单击编码列表中的 ANSI,然后单击“保存”。
如果收到以下警告,请单击“确定”继续执行步骤 3。
警告
此文件包含 Unicode 格式的字符,如果将此文件保存为 ANSI 编码的文本文件,将丢失。 若要保留 Unicode 信息,请单击下面的“取消”,然后从“编码”下拉列表中选择其中一个 Unicode 选项。 继续?
关闭SSLKey.reg文件,然后使用记事本重新打开它。
如果现在在证书指纹中看到问号或任何其他无效字符,则表明你可能遇到本文中所述的问题:
示例条目可能类似于以下内容:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib]
“Certificate”=“?b009d02038431da332f095b4ea6a126f4f5c7d18”