"SSPI コンテキストを生成できません" エラーが発生した場合、Windows認証を使用して接続SQL Server

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

注意

トラブルシューティングを開始する前に、前提条件を確認 してチェックリストを 確認することをお勧めします。

認証を使用してWindowsインスタンスSQL Server接続すると、次のエラー メッセージが表示されます。

ターゲット プリンシパル名が正しくありません。 SSPI コンテキストを生成できません。

よく寄せられる質問

SSPI とは

セキュリティ サポート プロバイダー インターフェイス (SSPI) は、TCP/IP ソケットなどの汎用データ トランスポート層を経由して委任と相互認証を行える一連の Windows API です。 1 つ以上のソフトウェア モジュールが実際の認証機能を提供します。 各モジュールはセキュリティ サポート プロバイダー (SSP) と呼ばされ、ダイナミック リンク ライブラリ (DLL) として実装されます。

Kerberos とは

Kerberos v5 プロトコルは業界標準のセキュリティ パッケージであり、オペレーティング システムの 3 つのWindowsです。 詳細については、「 Security Support Providers (SSP)」を参照してください

"SSPI コンテキストを生成できません" というエラーは何を意味しますか?

このエラーは、SSPI が Kerberos 認証を使用して TCP/IP または名前付きパイプを介してクライアント資格情報を委任して認証を行SQL Server。 ほとんどの場合、正しく構成されていないサービス プリンシパル名 (SPN) によってこのエラーが発生します。

SPN とは

サービス プリンシパル名 (SPN) は 、サービス インスタンスの一意の識別子です。 SPN は、 Kerberos 認証によって サービス インスタンスをサービス ログオン アカウントに関連付けるのに使用されます。 この関連付けプロセスにより、クライアント アプリケーションは、クライアントにアカウント名がなくても、サービスにアカウントの認証を要求できます。

たとえば、サーバーのインスタンスを実行しているサーバーの一般的な SPN SQL Serverは次のとおりです。

MSSQLSvc/SQLSERVER1.northamerica.corp.mycompany.com:1433

既定のインスタンスの SPN の形式は、名前付きインスタンスの SPN と同じです。 ポート番号は、SPN を特定のインスタンスに結び付く番号です。 サービス SPN の登録のSQL Server詳細については、「Kerberos Connections のサービス プリンシパル名を登録する」を参照してください

SSPI が NTLM 認証または Kerberos 認証を使用する理由

Windows認証は、ユーザーがユーザーに対して認証を行うSQL Server。 認証を使用するWindows NTLM または Kerberos を使用して認証されます。

SQL Server クライアントが TCP/IP ソケットを使用して、SQL Server を実行しているリモート サーバーに統合セキュリティを使用する場合、SQL Server クライアント ネットワーク ライブラリは SSPI API を使用してセキュリティ委任を実行します。 ネットワーク クライアントSQL Server AcquireCredentialsHandle 関数を呼び出し、パラメーターの "ネゴシエート" で渡pszPackageします。 このプロセスは、基になるセキュリティ プロバイダーに委任のネゴシエートを通知します。 このコンテキストでは、"ネゴシエート" とは、ユーザーベースのコンピューターで Kerberos または NTLM 認証Windows試みるという意味です。 言い換えると、Windowsを実行している宛先コンピューターに関連付けられた正しく構成された SPN がある場合、SQL Server Kerberos 委任が使用されます。 それ以外の場合、Windows NTLM 委任を使用します。

Kerberos で問題が発生した後、接続が NTLM にフェールオーバーしない理由

クライアントSQL Serverドライバー コードは、WinSock ネットワーク API を使用して、ドライバーが Windows 認証を使用してサーバーに接続するときに、サーバーの完全修飾 DNS を解決SQL Server。 この操作を実行するために、ドライバー コードは、 gethostbyname gethostbyaddr and WinSock API を呼び出します。 統合セキュリティを使用する場合、IP アドレスまたはホスト名がサーバーの名前として渡された場合でも、ドライバーはサーバーの完全修飾 DNS の解決を試します。

クライアント上SQL Serverドライバーがサーバーの完全修飾 DNS を解決すると、対応する DNS を使用してサーバーの SPN を形成します。 したがって、WinSock によって IP アドレスまたはホスト名を完全修飾 DNS に解決する際に問題が発生すると、SQL Server ドライバーがサーバーに対して無効な SPN を作成する可能性があります。

たとえば、クライアント側のSQL Serverは、次のように無効な SPN を解決するために完全修飾 DNS として使用できます。

  • MSSQLSvc/SQLSERVER1:1433
  • MSSQLSvc/123.123.123.123:1433
  • MSSQLSvc/SQLSERVER1.antartica.corp.mycompany.com:1433
  • MSSQLSvc/SQLSERVER1.dns.northamerica.corp.mycompany.com:1433

クライアント ドライバー SQL Server無効な SPN を形成すると、SSPI インターフェイスが Active Directory サービスで SPN を検索しようとするので、認証は引き続き機能します。 SSPI インターフェイスで SPN が見つからなかった場合、Kerberos 認証は実行されません。 その時点で、SSPI 層は NTLM 認証モードに切り替わります。ログオンでは NTLM 認証が使用され、通常は成功します。 ドライバーがSQL Server適切なコンテナーに割り当てられていない有効な SPN を形成する場合、ドライバーは SPN を試しますが、使用することはできません。 この場合、"SSPI コンテキストを生成できません" というエラーが発生することがあります。 スタートアップ アカウントSQL Serverローカル システム アカウントの場合、適切なコンテナーはコンピューター名です。 その他のアカウントの場合、適切なコンテナーはスタートアップ SQL Serverです。 認証では最初に見つけた SPN が使用されます。そのため、正しくないコンテナーに SPN が割り当てられていないか確認してください。 つまり、各 SPN は 1 つのコンテナーにのみ割り当てる必要があります。

接続の認証方法を確認する方法

接続の認証方法を確認するには、次のクエリを実行します。

SELECT net_transport, auth_scheme   
FROM sys.dm_exec_connections   
WHERE session_id = @@SPID;  

詳細については、「Determine If I Am Connected to SQL Server Kerberos Authentication」を参照してください

ユーザーの SPN を作成するSQL Server?

SQL Server データベース エンジンインスタンスがSQL Server データベース エンジン、SQL Server DsWriteAccountSpn API を使用して SQL Server サービスの SPN を自動的に登録します。 この呼び出しは、サービス SQL Serverが Active Directory で読servicePrincipalNameみ取りおよび書き込みservicePrincipalName権限を持っている場合に成功します。 それ以外の場合は、Active Directory 管理者が Microsoft Kerberos Manager for SQL Server または組み込みの Setspn ツールを使用して正しい SPN を手動で登録する必要があります。 サーバーの SPN の管理の詳細SQL Server Kerberos 接続のサービス プリンシパル名を登録するを参照してください

注意

この手順は、これらのエラー メッセージが表示される状況にのみ適用されます。断続的には適用されません。

Kerberos 接続が失敗する理由には、SPN の構成ミス、名前解決の問題、およびサービスのスタートアップ アカウントに対する権限SQL Server理由があります。 Microsoft Kerberos Configuration Manager (KCM) は、エラーの原因を確認するのに役立つツールです。 KCM には、プロセスで特定された問題を修正するためのオプションも用意されています。

KCM でエラーを修正するには、次の手順に従います。

  1. 接続に問題があるコンピューターで、 Kerberos Configuration Manager をダウンロードしてインストールします

  2. KerberosConfigMgr.exe %SystemDrive%:\Program Files\Microsoft\Kerberos Configuration Manager フォルダーから開始します。 次に、接続できないコンピューターに接続SQL Serverアクセス許可を持つドメイン アカウントを使用します。

  3. コンピューター Connect KCM を実行している場合は、シナリオに適用可能なサーバー名などの詳細を空白のままにして、[サーバー名] をSQL Serverします。 [Connect 選択して分析を実行します。 KCM は、必要な情報の取得が完了すると、自動的に [SPN] タブに切り替わり、既定では SQL Server、SQL Server Reporting Services、Analysis Services、および AG リスナーの情報を表示します。 このエラーのトラブルシューティングを行う場合は、このエラー以外のSQL Server。

  4. [状態] 列を使用してツールから診断を確認し、関連する手順に従って問題を解決します。

    状態 詳細 アクション
    Good チェックされたアイテムが正しく構成されています。 出力で次に進みます。 必要なアクションなし
    必須の SPN が見つからない Active Directory のスタートアップ アカウントの [必須 SPN] 列で識別された SPN が見つからないSQL Server状態が報告されます。 1. [ 修正] を 選択して、[警告] ダイアログ ボックスで情報 確認します。
    2. [ はい] を 選択して、不足している SPN を Active Directory に追加します。
    3. ドメイン アカウントに Active Directory を更新するために必要なアクセス許可がある場合、必要な SPN が Active Directory に追加されます。
    4. ドメイン アカウントに Active Directory の更新に必要なアクセス許可が付与されていない場合は、[生成] または [すべて生成] を使用して、Active Directory 管理者が不足している SPN を追加するのに役立つスクリプトを生成します。
    5. SPN を追加した後、Kerbersos Configuration Manager を再度実行して、SPN の問題が解決されたと確認します。
    Kerberos 構成を使用するには、TCP を有効にする必要があります これは、クライアント コンピューターで TCP が有効になっていない場合に発生します。 クライアント インスタンスで TCP/IP プロトコルを有効にするにはSQL Server手順を実行します。
    1. [ネットワークSQL Server 構成マネージャー] ウィンドウで、[ ネットワーク構成] SQL Server展開します
    2. コンソール ウィンドウで 、[ プロトコル] を選択 します <instance name>。
    3. 詳細ウィンドウで **、[**TCP/IP] を右クリックし、[有効にする] を 選択します
    4. コンソール ウィンドウで 、[ サービス] をSQL Serverします
    5. [詳細] ウィンドウ で 、[SQL Server] を右クリックし、[<instance name>再起動] を選択してサービスを停止SQL Serverします。
    詳細については、「サーバー ネットワーク プロトコル を有効または無効にする」を参照してください
    動的ポート このメッセージは、動的ポート (既定の構成) を使用する名前付きインスタンスに対して表示されます。 Kerberos を使用して SQL Server に接続する必要がある環境では、名前付きインスタンスを静的ポートに設定し、SPN を登録するときにそのポートを使用する必要があります。 静的ポートを使用SQL Serverインスタンスを構成するには、次の手順を実行します。
    1. [SQL Server 構成マネージャー<instance name>] ウィンドウで、[ネットワーク構成] を展開し、[プロトコルSQL Server] を展開し、[TCP/IP] をダブルクリックします
    2. [TCP/IP プロパティ] ダイアログ ボックスで、[プロトコル] タブの [ すべて リッスン] 設定 を確認 します。
    3. [すべて聞く] 設定が [ はい] に設定されている場合は、[IP アドレス] タブに切り替えて、[IPAll] Windowsの下部までスクロールします。 TCP 動的ポートに含まれる現在の値を削除し、[ TCP ポート] フィールドに目的の値 を設定 します。 [OK] を選択し、SQL Serverインスタンスを再起動して、設定を有効にします。
    4. [ すべてリッスン] 設定が [いいえ] に設定されている場合は、[ IP アドレス] タブに切り替えて、IP1、IP2 に表示される各 IP アドレスを確認します。 有効な IP アドレスの場合は、[TCP 動的ポート] フィールドに含まれる現在の値を削除し、[ TCP ポート] フィールドに目的の 値を設定 します。 [OK] を選択し、SQL Serverインスタンスを再起動して、設定を有効にします。
    詳細については、「特定の TCP ポートでリッスンするサーバーを構成する」を参照してください
    重複する SPN 同じ SPN が Active Directory の異なるアカウントで登録されている場合に発生する可能性があります。 1. [修正] ボタンを 選択し、[警告] ダイアログ ボックスで情報を表示し、不足している SPN を Active Directory に追加できる場合は [はい] を選択します。
    2. ドメイン アカウントに Active Directory を更新するために必要なアクセス許可がある場合、正しくない SPN が削除されます。
    3. ドメイン アカウントに Active Directory を更新するための必要なアクセス許可が付与されていない場合は、[生成] または [すべて生成] ボタンを使用して、重複する SPN を削除するために Active Directory 管理者に引き渡す必要なスクリプトを生成します。 SPN を削除したら、KCM を再実行して、SPN の問題が解決されたと確認します。

    注意

    KCM を開始するドメイン アカウントに Active Directory で SPN を操作する権限が付与されていない場合は、SPN スクリプト列の対応する [Generate or Generate All] ボタンを使用して、必要なコマンドを生成し、Active Directory 管理者と作業して KCM によって識別される問題を修正できます。

  5. KCM で特定された問題を修正した後、ツールを再実行します。 他の問題が報告されていないか確認してから、接続を再試行します。 ツールが問題を報告する場合は、前の手順を繰り返します。

Kerberos Configuration Manager なしでエラーを修正する

KCM を使用できない場合は、次の手順を実行します。

手順 1: ping コマンドで名前の解決を確認する

Kerberos 認証が成功する主な要因は、ネットワーク上の有効な DNS 機能です。 この機能は、コマンド プロンプト ユーティリティを使用してクライアントとサーバーで Ping 確認できます。 クライアント コンピューターで、次のコマンドを実行して、SQL Server (コンピューターの名前) を実行しているサーバーの IP アドレスを取得しますSQLServer1

ping sqlserver1

Ping ユーティリティが完全修飾 DNS SQLServer1を解決するかどうかを確認するには、次のコマンドを実行します。

ping -a <IPAddress>

例:

C:\>ping SQLSERVER1

Pinging SQLSERVER1 [123.123.123.123] with 32 bytes of data:

Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128

Ping statistics for 123.123.123.123:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum =  0ms, Average =  0ms 
C:\>ping -a 123.123.123.123

Pinging SQLSERVER1.northamerica.corp.mycompany.com [123.123.123.123] with 32 bytes of data:

Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Ping statistics for 123.123.123.123:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum =  0ms, Average =  0ms

C:\> 

コマンドを実行ping -a <IPAddress>しているコンピューターの適切な完全修飾 DNS SQL Server解決すると、クライアント側の解決も成功します。

詳細な診断については、 Test-NetConnection コマンドレットまたは Test-Connection コマンドレットを使用して、コンピューターにインストールされている PowerShell バージョンに従って TCP 接続をテストします。 PowerShell コマンドレットの詳細については、「コマンドレットの概要 」を参照してください

注意

名前解決方法には、DNS、WINS、Hosts ファイル、および Lmhosts ファイルが含まれる場合があります。 名前解決の問題とトラブルシューティングの詳細については、次のリンクを参照してください。

宛先サーバーのエイリアスが、SQL Serverクライアント ネットワーク ユーティリティSQL Server 構成マネージャーに存在SQL Server確認します。 このようなエイリアスが存在する場合は、サーバー名、ネットワーク プロトコル、ポート番号などによって正しく構成されていることを確認します。

手順 2: ドメイン間の通信を確認する

サインインするドメインが、ドメインを実行しているサーバーのドメインと通信SQL Server。 ドメインに正しい名前解決が必要です。

  1. サービスのスタートアップ アカウントとWindows同じドメイン アカウントとパスワードを使用して、SQL Serverサインインできます。 たとえば、次のいずれかの状況で SSPI エラーが発生することがあります。

    • ドメイン アカウントがロックアウトされています。
    • アカウントのパスワードが変更されたSQL Serverサービスを再起動しなかった。
  2. ログオン ドメインがサーバーで実行されているサーバーのドメインと異なる場合はSQL Server間の信頼関係を確認します。

  3. サーバーが属するドメインと、接続に使用するドメイン アカウントが同じフォレスト内にあるかどうかを確認します。 SSPI が動作するには、この手順が必要です。

手順 3: SQLCheck SQL Server Setspn ツールを使用して SPN を確認する

ローカルコンピューターにローカルでサインインし、SQL Serverアクセス権を持つ場合は、Microsoft SQL ネットワーク GitHubリポジトリから SQLCheck を使用します。 SQLCheck は、1 つのファイルのトラブルシューティングに必要なほとんどの情報を提供します。 ツールの使用方法と収集する情報の詳細については、ツールのホーム ページを参照してください。 また、推奨される前提条件とチェックリスト ページ を確認することもできます。 出力ファイルを生成したら、出力ファイルの [SQL Server 情報] セクションで、SQL Serverインスタンスの SPN 構成を確認します。

出力例:

Suggested SPN                                               Exists  Status              

----------------------------------------------------------  ------  ------------------- 

MSSQLSvc/testsqlsvr.corp.com:2000                           True    Okay                

MSSQLSvc/testsqlsvr.corp.com                                True    Okay                

MSSQLSvc/testsqlsvr:2000                                    False   SPN does not exist. 

MSSQLSvc/testsqlsvr                                         False   SPN does not exist. 

上記の出力を使用して、次の手順 (以下の例を参照) を決定し、 Setspn ツールを使用して SPN の問題を解決するために必要な修復アクションを実行します。

シナリオ 提案されているアクション
SPN が存在しない サービス アカウントに必要な SPN をSQL Serverします。
重複する SPN 正しくないアカウントで、SQLサービスに登録されている SPN を削除します。
正しくないアカウントの SPN 正しくないアカウントで SQL サービスの登録済み SPN を削除し、正しいサービス アカウントに SPN を登録します。

注意

  • SQLCheck ツールの SQL Serverセクション を確認して、インスタンスのサービス アカウントをSQL Serverできます。

  • Setspn は、Active Directory の SPN の読み取り、追加、変更、または削除に役立つ新しいバージョンの Windowsの組み込みツールです。 このツールを使用して、Kerberos 接続SQL Serverサービス プリンシパル名の登録に基SQL Server SPN が構成されていることを確認できます。 詳細については、「 Setspn ツールと 使用例」を参照してください。

  • SPN が自動的に登録されるシナリオSQL Server SPN の手動登録が必要なシナリオの詳細については、「Kerberos Connections のサービス プリンシパル名を登録する」を参照してください。

手順 4: リンク サーバー上のスタートアップ SQL Serverアカウントのアクセス許可を確認する

リンク サーバーの [セキュリティ] ページで [偽装] を認証オプションとして使用する場合、SQL Server は、受信資格情報をリモート サーバーに渡すSQL Server。 リンク SQL Serverが定義されているスタートアップ アカウントは、Active Directory で [委任] 権限が割り当てられているアカウントが信頼されている必要があります。 詳細については、「委任に対 してコンピューターアカウントとユーザー アカウントを信頼できる」を参照してください

注意

この手順は、リンク されたサーバー クエリに関連する問題のトラブルシューティングを行う場合にのみ必要です。

関連項目