當伺服器設定為使用 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> 伺服器錯誤:17120,嚴重性:16,狀態:1。
<Datetime> Server SQL Server 無法繁衍 FRunCM 線程。 請檢查 SQL Server 錯誤記錄檔與 Windows 事件記錄檔,以取得可能與問題相關的資訊。
原因
這些徵兆的常見根本原因是,當憑證在 MMC 中從 Certificates 嵌入式管理單元的豐富編輯控件複製出來時,可能會不小心新增至憑證的指紋值。
解決方法
您可以使用下列其中一個解決方案:
當您複製憑證的指紋值時,請避免從 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),因為它們不會在憑證嵌入式管理單元中使用豐富的編輯控件
若要檢查您是否正在執行本文所記載的問題,您可以使用下列程式:
開啟 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”