當伺服器設定為使用 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 錯誤記錄檔中:

<Datetime> Server 錯誤:17182,嚴重性:16,狀態:1。
<Datetime> Server TDSSNIClient 初始化失敗,發生錯誤0xd,狀態代碼0x38。
<Datetime> Server 錯誤:17182,嚴重性:16,狀態:1。 <Datetime> Server TDSSNIClient 初始化失敗,發生錯誤0xd,狀態代碼0x1。
<Datetime> Server 錯誤:17826,嚴重性:18,狀態:3。
<由於網路連結庫發生內部錯誤,所以 Datetime> Server 無法啟動網路連結庫。 若要判斷原因,請在錯誤記錄檔中檢閱緊接在此錯誤記錄檔前面的錯誤。
<Datetime> Server 錯誤: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

指紋可以位於以 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) 至下列登錄機碼下的憑證值:

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”