次の方法で共有


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> サーバーは、ネットワーク ライブラリの内部エラーのため、ネットワーク ライブラリを起動できませんでした。 原因を判断するには、このエラーの直前に発生したエラーをエラー ログで確認してください。
<Datetime> サーバー エラー: 17120、重大度: 16、状態: 1。
<Datetime> Server SQL Server で FRunCM スレッドを生成できませんでした。 関連する可能性のある問題の情報については、SQL Server エラー ログと Windows イベント ログを確認してください。

原因

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

解決方法

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

  • 証明書の拇印の値をコピーするときは、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 になります) 次のレジストリ キーの証明書の値にコピーできます。

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

詳細

エラー メッセージ 17182 に 0x38 状態コードは、SSL の初期化中に SQL Server でエラーが発生したことを意味します。 詳細については、 SQL プロトコル を参照してください。

戻りコード 0xd は、OS エラー 0xd (13) を示します。これは、"データが無効です" に変換されます。上記のエラー 17182 "TDSSNIClient の初期化がエラー 0xdで失敗しました。状態コード0x38" は、 Certificate 値の下の文字列を証明書の有効な拇印に正しく変換できないことが原因で発生します。

証明書スナップインに関するこの GUI の問題は、古いバージョンの Windows (Windows XP、Windows Server 2003 など) では発生しません。証明書スナップインでリッチエディット コントロールが使用されていないためです

この記事に記載されている問題が発生しているかどうかを確認するには、次の手順を使用します。

  1. regedit を開き、次のレジストリ キーに移動し、キーをSSLKey.reg ファイルにエクスポートします。

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

  2. メモ帳を使用して手順 1 のSSLKey.reg ファイルを開き、File メニューの [の保存] ダイアログ ボックスを使用して、[Encoding] リストの [ANSI をクリックし、Save をクリックします。

  3. 次の警告が表示された場合は、 OK をクリックして手順 3 に進みます。

    警告

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

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

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

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

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