サーバーが SSL を使用するように構成されている場合、SQL Serverの起動に失敗する

この記事では、サーバーが SSL を使用するように構成されている場合に発生するエラー 17182 (TDSSNIClient の初期化がエラー 0xd、状態コード 0x38で失敗しました) の解決策について説明します。

適用対象: SQL Server
元の KB 番号: 2023869

現象

次のような状況で問題が発生します。

  • Windows Server 2008 以降のバージョンのオペレーティング システムを実行しているシステムでホストされている、SQL Server 2005 以降のバージョンのインスタンスがあります。

  • 証明書の拇印を次のレジストリ キーの [証明書] 値に手動で入力して、SQL Serverの SSL 暗号化を構成しました。

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

このシナリオでは、SQL Serverが起動に失敗し、次のメッセージがSQL Serverエラー ログに記録されます。

<Datetime> サーバー エラー: 17182、重大度: 16、状態: 1。
<Datetime> Server TDSSNIClient の初期化が失敗し、エラー 0xd、状態コード0x38。
<Datetime> サーバー エラー: 17182、重大度: 16、状態: 1。 <Datetime> Server TDSSNIClient の初期化が失敗し、エラー 0xd、状態コード0x1。
<Datetime> サーバー エラー: 17826、重大度: 18、状態: 3。
<Datetime> Server ネットワーク ライブラリで内部エラーが発生したため、ネットワーク ライブラリを起動できませんでした。 原因を特定するには、エラー ログ内のこのエラーの直前にあるエラーを確認します。
<Datetime> サーバー エラー: 17120、重大度: 16、状態: 1。
<Datetime> Server SQL Serverで FRunCM スレッドを生成できませんでした。 発生する可能性のある関連する問題については、SQL Serverエラー ログと Windows イベント ログを確認してください。

原因

これらの現象の一般的な根本原因は、MMC の証明書スナップインのリッチ エディット コントロールからコピーされるときに、証明書の拇印の値に誤って追加された可能性がある非表示の文字です。

解決方法

次のいずれかの解決策を使用できます。

  • 証明書の拇印の値をコピーするときは、MMC の証明書スナップインから先頭文字をコピーしないでください。

  • MMC の証明書スナップインの代わりに Certutil ツールを使用して、証明書をテキスト ファイルにエクスポートし、必要な証明書の拇印の値をテキスト ファイルからコピーします。 使用法を次に示します。

    コンピューターの現在のユーザー証明書ストアの内容を表示するには、コマンド プロンプトで次のように入力します。

    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状態コードは、SSL の初期化中SQL Serverエラーが発生したことを意味します。 詳細については、「 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. 以下の警告が表示された場合は、[OK] をクリックして手順 3 に進 みます

    警告

    このファイルには Unicode 形式の文字が含まれています。このファイルを ANSI でエンコードされたテキスト ファイルとして保存すると失われます。 Unicode 情報を保持するには、下の [キャンセル ] をクリックし、[エンコード] ドロップダウン リストから Unicode オプションのいずれかを選択します。 続行しますか?

  4. SSLKey.reg ファイルを閉じ、メモ帳を使用して再度開きます。

  5. 証明書の拇印に疑問符またはその他の無効な文字が表示された場合は、この記事に記載されている問題が発生している可能性があることを示しています。

    エントリの例は、次のようになります。

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