Windows 2012で実行している場合、Java Webコンテナー(TomcatとJettyの両方を試しました)への認証に苦労しています。
Negotiate認証スキームを試行するたびにエラーが発生します:org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
再現手順
Windows Server 2012または2016インスタンスのセットアップから始めて、Active Directoryドメインサービスをインストールします。
私の例では、次のものを作成しました。
NETBIOSドメイン:NICKIS
DNSドメイン:nickis.life
Active Directoryでkerberosサブジェクトユーザーを作成する
重要:名、姓、氏名が同じであることを確認してください!
私の場合の新しいユーザーは次のとおりです。
[〜#〜] dn [〜#〜]= _CN=kerberos500,CN=Users,DC=nickis,DC=life
_
login + domain= _[email protected]
_
NETBIOS\samAccountName= _NICKIS\kerberos500
_
Windows Active Directoryサーバーからsetspnコマンドを実行します
_setspn -A HTTP/[email protected] kerberos500
_
出力例:
_C:\Users\Administrator>setspn -A HTTP/nickis.life kerberos500
Checking domain DC=nickis,DC=life
Registering ServicePrincipalNames for CN=kerberos500,CN=Users,DC=nickis,DC=life
HTTP/kerberos500.nickis.life
Updated object
_
Windows Active Directoryサーバーからktpassコマンドを実行します
_ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/[email protected] -mapUser kerberos500 -mapOp set -pass XXXXpasswordforkerberos500userXXXX -crypto DES-CBC-MD5 -pType KRB5_NT_PRINCIPAL +DesOnly
_
出力例:
_C:\Users\Administrator>ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/[email protected] -mapUser kerberos500 -mapOp set -pass xxxxxxxx -crypto DES-CBC-MD5 -pType KRB5_NT_PRINCIPAL +DesOnly
Targeting domain controller: WIN-OVV6VHBGIB8.nickis.life
Using legacy password setting method
Successfully mapped HTTP/kerberos500.nickis.life to kerberos500.
Key created.
Output keytab to c:\Users\Administrator\kerberos500.keytab:
Keytab version: 0x502
keysize 71 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x3 (DES-CBC-MD5) keylength 8 (0xcd07200bea625d20)
Account kerberos500 has been set for DES-only encryption.
_
この時点で、キータブファイルが作成されています。
_c:\Users\Administrator\kerberos500.keytab
_
ユーザープリンシパル:
_HTTP/[email protected]
_
これらは、GSSApiに提供してKerberosでシングルサインオンを取得するために必要な2つの入力です。
そこで、これらの入力を、HadoopセキュリティモジュールのWebコンテナのKerberosセキュリティレルムにデプロイしました。
カールテストカールを使ってテストしようとして失敗しました:
_curl --negotiate -u : http://nickis.life:8080/my/webapp
_
Internet ExplorerテストInternet Explorerを使用してみました。 Internet Explorerの信頼できる役割に_nickis.life
_ドメインを追加しました。次に、Internet Explorerでサイトを起動します。 http://nickis.life:808
いずれにしても、以下のエラーが表示されます。
_org.Apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at org.Apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.Java:398) ~[hadoop-auth-2.7.1.jar:?]
...
Caused by: org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at Sun.security.jgss.GSSHeader.<init>(Unknown Source) ~[?:1.8.0_131]
at Sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) ~[?:1.8.0_131]
at Sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) ~[?:1.8.0_131]
at org.Apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.Java:365) ~[hadoop-auth-2.7.1.jar:?]
at org.Apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.Java:347) ~[hadoop-auth-2.7.1.jar:?]
at Java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_131]
at javax.security.auth.Subject.doAs(Unknown Source) ~[?:1.8.0_131]
at org.Apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.Java:347) ~[hadoop-auth-2.7.1.jar:?]
_
私は困惑しています。注:私はあちこちでいくつかのリンクを見つけましたが、ここで要約したように、それらのいずれも従った手順に含まれていませんでした。
A
レコードとして設定しようとしました。誰も私がここで間違っていることをトレースできますか?
更新:
fusionis.life
_に設定されたADサーバーがあり、ADサーバーは_WIN-OVV6VHBGIB8.fusionis.life
_ですDESKTOP-VTPBE99.fusionis.life
_dnsmgmt.msc
_を開き、ホストが_DESKTOP-VTPBE99.fusionis.life
_ボックスのIPに設定された「kerberos500.nickis.life」で「前方参照ゾーン」を追加しました。C:\Users\Administrator>ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/[email protected] -mapUser kerberos500 -mapOp set -pass xxxxxxxxx -crypto ALL -pType KRB5_NT_PRINCIPAL Targeting domain controller: WIN-OVV6VHBGIB8.fusionis.life Using legacy password setting method Successfully mapped HTTP/kerberos500.nickis.life to kerberos500. Key created. Key created. Key created. Key created. Key created. Output keytab to c:\Users\Administrator\kerberos500.keytab: Keytab version: 0x502 keysize 67 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x04e30b9183ba8389) keysize 67 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x3 (DES-CBC-MD5) keylength 8 (0x04e30b9183ba8389) keysize 75 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x17 (RC4-HMAC) keylength 16 (0xe39a141de38abd8750bf9c0bf49fd1c5) keysize 91 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x12 (AES256-SHA1) keylength 32 (0xe368a1b060cfe4816f522c1c5f62ca07fe201ed96c6d018054dfbd5b86251892) keysize 75 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x11 (AES128-SHA1) keylength 16 (0x1b1a548fa2893a78c6f4c7f9c482b614)
キータブ更新ファイルをサーバーに保存し、サービスプリンシパルを_HTTP/[email protected]
_に更新しました
ドメインユーザーとしてTomcatマシンにログインし、信頼できるサイトに http://kerberos500.nickis.life を追加してから、 http://kerberos500.nickis.life:8764に移動しました
Kerberos500 ADの「アカウント」タブで、暗号化チェックボックスのすべての組み合わせをチェックしました。
今、私は新しいエラーを取得しています...
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
更新:
最終的に解決しました。 _fusionis.life
_が_nickis.life
_と同じホスト上にある必要があるため、この最終エラーが発生しました。
エラー「Defective token detected」は、おそらく ntlm トークンが検出されたことを意味します。 kerberos が失敗した場合-それ以外の場合にWebサーバーから指示されない場合、それはNegotiateのメカニズムが一般的なWebブラウザー内で使用します。 windows オペレーティングシステムでは、IE上のWebブラウザ(および正しく構成されている場合はFirefox))は、基本的に、Kerberosを実行しない場合、 NTLMトークンを送信します。そして、サーバーは「ノーウェイ」と応答します。NTLMについても知らないので、送信したものを欠陥品と呼んでいます。初めてこれを設定しているようですので、 Kerberosが失敗したときのフォールバックメカニズム(NTLMなど)を構成するため、そのエラーメッセージを表示します。Kerberosが失敗する理由を理解することでこれを解決します。これらの2つの項目を解決したとしても、暗号化に関連して失敗し続ける可能性のある3番目の理由と4番目の理由があります。
キータブを適切に再生成する方法:そのユーザーアカウントに関連付けられたキータブを作成する予定があるときはいつでも、setspn -aコマンドを実行してADユーザーにSPNを追加しないでください。その理由は、keytab作成コマンドがコマンドの一部としてSPNをユーザーアカウントに追加するためです。上記の私のアドバイスに従ってもシナリオが機能しない場合は、以下のようにsetspn -Dを使用してSPNを削除する必要があります。
setspn -D HTTP/[email protected] kerberos500
その後、キータブを再生成しますが、私の唯一の変更点は、すべての暗号化タイプを使用するように指示したことです。クライアントとサーバーは、認証プロセス中に最も一般的なものに同意します。
ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/[email protected] -mapUser kerberos500 -mapOp set -pass XXXXpasswordforkerberos500userXXXX -crypto ALL -pType KRB5_NT_PRINCIPAL
次に、古いキータブを新しいキータブに置き換えます。キータブの追加の詳細情報については、Kerberosキータブの作成方法に関する私の技術記事の詳細をご覧ください: Kerberosキータブ–説明 。私は頻繁に戻って、このフォーラムにある質問に基づいて編集します。
ところで、HTTP/kerberos500.nickis.lifeはサービスプリンシパルであり、質問で書いたユーザープリンシパルではありません。このようなHTTPシナリオでKerberosをテストするのにWebブラウザーのみを使用し、cURLは使用しません。
上記で強調した4つのポイントすべてを真剣に検討していただければ、この問題を解決できます。
EDIT1:この回答は、kerberos500.nickis.lifeの完全修飾ドメイン名を持つホストで実行されているHTTPサービスがあることを前提としています。その名前のそのようなホストがない場合、私の答えはわずかに変わります。もしあれば教えてください。
EDIT2:http://nickis.life:808 のURLを使用して認証の目的を達成するには、既に作成したものと同じキータブを使用し続けます。
ADアカウントNICKIS\kerberos500で、[アカウント]タブに移動し、一番下までスクロールして、[このアカウントにKerberos DES暗号化タイプを使用]のチェックボックスをオンにします。
次に、グループポリシーを介してADドメインレベルでDES暗号化自体を有効にします。これを行うには、以下を実行します。
参照: Kerberos対応暗号化タイプのWindows構成
編集3:Kerberos KDC(DC)、クライアント、およびサーバーを 同じ マシンで実行しないでください。それは、他のすべてを正しく行った場合でも、「欠陥トークンエラー」を取得するための古典的なレシピです。
編集4:(OPによって検証された最終更新):新しいktpassキータブ作成出力を見て、私はこれを見た:ターゲットドメインコントローラ:WIN-OVV6VHBGIB8.fusionis.life。現在、キータブで定義されているSPNはHTTP/kerberos500.nickis.lifeです。 ADドメイン名は定義したSPNとは異なるため、これらのドメイン間に何らかの信頼関係のセットアップがない限り、これは機能しません。信頼できない場合は、代わりにHTTP/kerberos500.fusionis.lifeのSPNを使用する必要があります。