当服务器配置为使用 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> Server TDSSNIClient 初始化失败,0xd错误,状态代码0x38。
<Datetime> 服务器错误:17182,严重性:16,状态:1。 <Datetime> Server TDSSNIClient 初始化失败,出现错误0xd,状态代码0x1。
<Datetime> 服务器错误:17826,严重性:18,状态:3。
<由于网络库中出现内部错误,Datetime> 服务器无法启动网络库。 若要确定原因,请在错误日志中查看紧挨着此错误前面的错误。
<Datetime> 服务器错误:17120,严重性:16,状态:1。
<Datetime> 服务器SQL Server无法生成 FRunCM 线程。 查看SQL Server错误日志和 Windows 事件日志,了解有关可能相关问题的信息。

原因

这些症状的常见根本原因是,当证书从 MMC 中的“证书”管理单元的 rich-edit 控件复制出来时,该字符可能无意中被添加到证书的指纹值中。

解决方案

可以使用以下任一解决方法:

  • 复制证书的“指纹”值时,避免从 MMC 中的“证书”管理单元复制前导字符。

  • 使用 Certutil 工具而不是 MMC 中的证书管理单元将证书导出到文本文件,然后从文本文件复制所需证书的指纹值。 使用情况如下所示:

    若要查看计算机的当前用户证书存储的内容,请在命令提示符处键入以下命令:

    certutil -store -user my

    若要查看计算机的本地计算机证书存储的内容,请在命令提示符处键入以下命令:

    certutil -store my

可以在基于 Vista 的操作系统上的管理命令提示符处使用以下命令将上述命令的输出定向到文本文件:

certutil -store my > cert.txt

指纹可以位于以 Cert Hash (sha1) 开头的行中

例如:Cert Hash (sha1) : e7 02 4b 42 c4 04 fd 44 8c ec 21 f1 91 76 5c b7 c3 ad 1d 55

然后,可以复制此值 (而不带空格 - 对于上述示例,它将 e7024b42c404fd448cec21f191765cb7c3ad1d55) 到以下注册表项下的 Certificate 值:

HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib

更多信息

错误消息 17182 中0x38状态代码表示SQL Server在 SSL 初始化过程中遇到错误。 有关更多详细信息,请参阅 SQL 协议

返回代码 0xd 表示 OS 错误0xd (13) 转换为“数据无效”上述错误 17182“TDSSNIClient 初始化失败并出现错误0xd,状态代码0x38”,具体原因是 证书 值下的字符串无法正确转换为证书的有效指纹。

证书管理单元的此 GUI 问题不会出现在旧版本的 Windows (例如 Windows XP、Windows Server 2003) 上,因为它们不使用证书管理单元中的丰富编辑控件

若要检查是否遇到本文中所述的问题,可以使用以下过程:

  1. 打开 regedit 并导航到以下注册表项,并将密钥导出到SSLKey.reg文件:

    HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib

  2. 使用记事本打开步骤 1 中的SSLKey.reg文件,并使用“文件”菜单中的“另存为”对话框,单击“编码”列表中的“ANSI”,然后单击“保存”。

  3. 如果收到以下警告,请单击“ 确定”转到步骤 3。

    警告

    此文件包含 Unicode 格式的字符,如果将此文件另存为 ANSI 编码的文本文件,这些字符将丢失。 若要保留 Unicode 信息,请单击下面的“ 取消 ”,然后从“编码”下拉列表中选择一个 Unicode 选项。 继续?

  4. 关闭SSLKey.reg文件,并使用记事本重新打开它。

  5. 如果现在在证书的指纹中看到问号或任何其他无效字符,则表明你可能遇到了本文中所述的问题:

    示例条目可能类似于以下内容:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib]
    “Certificate”=“?b009d02038431da332f095b4ea6a126f4f5c7d18”