2016-12-22 7 views
2

本当にまっすぐなことがあればお詫び申し上げます。私はこれに間違っています。GSSAPIとJAASに関する多くの情報を見つけるのは本当に難しいことです。GSSAPI不具合チケット

私はIISサーバーに要求し、Kerberosを使用して認証するプログラムを作成しています。

私は2つのVMを持っています:最初はActive Directoryドメインコントローラです。もう1つはIISサーバーを実行しています。

私のマシンからは、認証にGSSAPIとJAASを使用するプログラムを実行しています。この段階では、私はちょうどそれの周りに頭を浮かべてしようとしているので、それはかなり重くthe Oracle tutorials for GSSAPIに基づいています。 KrbLoginModuleを使用してログインすると、ドメインからの特定のテストユーザーに基づいてサブジェクトが作成され、すべて正常に動作しているように見えます。ネットワークトレースには、AS-REQ、AS-REP、TGS-REQ、およびTGS-REPがあります(私が正しいとすれば、私のマシンとドメインコントローラVMの間にあるはずです)。

私のプログラムでは、上記で生成されたサブジェクトを使用して、ほとんどがcode from the GSSAPI/JAAS tutorialに基づくGSSAPIコードを実行します。それはエラーなしで名前/信任状/文脈を作成しますが、文脈を確立しようとすると、状況が間違って始まります。

私はもともとそれがチュートリアル(上記のリンク)で行うのか、コンテキストループをしていた

が、それは、サーバーからトークンを読み始めることを試みた(すなわちtoken = new byte[inStream.readInt()];lengthが、それは読んでint型は、1213486160(巨大な数でした私はそれをチェックする - それは毎回そうだったようだった)。これにより、OutOfMemoryErrorが発生しました。

その後、入出力ストリームを受け取るinitSecContextの「ストリームバージョン」を使用し始めました(私は自分のサーバーに開いていたソケットの入出力ストリームを提供しました。これは最初はかなりうまくいくようです。それは1回の反復で確立されますが、メッセージをラップ/アンラップしようとすると、何かが間違ってしまうようになります。このためネットワークトレースが生成されたトークンと同じ長さのTCPメッセージを(私はそれがラップトークンビーイングになることを仮定している示して

org.ietf.jgss.GSSException, major code: 10, minor code: 0 
    major string: Defective token 
    minor string: Bad token tag: 7284 

:あなたがメッセージをアンラップしようとすると、エラーがスローされます送られた)。次に、ICMPリダイレクトがあります。私はこれが何もないかどうかはわかりませんが、私はそれに言及したいと思いました(私はそれが最初のTCPメッセージのほぼすべてを含んでいることに気付きました)。

次に、HTTP応答があります。それは400の悪い要求です。応答の本文では、無効な動詞であると言います(動詞で「GET」や「POST」などの意味があると仮定しています)。トレースには、最初のTCPメッセージです。ちょっとしたグーグルで、私はa guy who had a similar problemを見つけました。それは、送信されたリクエストのヘッダーをつぶっているアンチウィルスに関するものでした(多分リダイレクトに関係していますか?)。

サーバからの長さ= 0のTCP肯定応答が後に続く、私のマシンからのいくつかのTCPメッセージ(3行に1つ)が続きます(wrapメソッドでメッセージに送信しているデータが入っています)。

だから、何ができるかわからない(おそらくリダイレ​​クトだが、それはそう思わないだろう)

UPDATE:

私は別のVM(同じActive Directoryドメイン上の)上でそれを実行しているが、それはまだHTTP 400不正な要求応答を取得しています。以前とは異なり、Kerberosを使用しています(上記のNTLM要求を送信しています)。

ネットワークトレースは、ASとTGSの要求と応答を示し、次にチケットが送信されます。その後、IISサーバーは400 Bad Request(無効な動詞)を返します。微妙な違いがあります。不正なRequestレスポンスは、送信されるトークンへの応答ではなくなりましたが、400の直前に空のACK TCPメッセージがあります。

プログラムは、

General failure, unspecified at GSSAPI level 
    minor string: Error in method wrap, error: java.net.SocketException: 
     Unrecognized Windows Sockets error: 0: socket write error 

UPDATE:私はinitSecContextとトークンに読んだときに、先に述べたように

は、私が第1の長さを期待してい(つまり、あなたがメッセージをラップしようとした場合、それはで壊れますtoken = new byte[inStream.readInt()];)を参照してください。私が得ているのは、OutOfMemoryErrorを引き起こした1213486160です。私は、1213486160が0x48545450であることを認識しました。これはASCIIで "HTTP"です。だから私は文字の次の束を読んで、 "応答トークン"は、HTTP 400のバッドリクエストです。

これは、私がチュートリアルに示されているように、長さの整数を読み込むはずかどうかを疑問に思います。私はこの質問が幾分違うと感じるので、new question hereを作った。しかし、それは問題ではないかもしれません(まず最初に "悪いリクエスト"を送る原因とはならない)ので、私はこの質問を今開いたままにしておきます。

別の更新:

は、だから私はinitSecContextで吐き出すと、Base64でエンコードになってきたトークンを見て、それがYII ...(即ち、aはトークンネゴシエート)です。

クロムからログインし、ASとTGSのメッセージの後に、Authorization:Negotiate YIIのヘッダー行を含むHTTP GETリクエストを送信すると、ネットワークトレースを詳しく調べました。これは、トークンの長さのTCPメッセージを送信するプログラムとは対照的に、トークンです。

これは私が確立する文脈のステップ(少なくともチュートリアルに示されているように)を行う必要はないこと、あるいはトークンをつかんで、ストレートTCPメッセージ。 GSSAPI/Kerberosを使用してこれを確認できるIISの認証を行った人は誰ですか(人の例 - 実際には見つからないようですか)?

+1

私はちょうどあなたの質問に投票した人でした。素晴らしい詳細。さて、私はあなたに質問しました:あなたは2つのVMを持っていたと言いました。最初はActive Directoryドメインコントローラで、もう1つは実行中のIISサーバーです。あなたのクライアントマシンもこのActive Directoryドメインに参加していますか? Kerberos認証が機能する必要があります。 「欠陥のあるトークン」は、一般に、サーバがKerberos認証トークンを要求している間に、クライアントマシンがNTLM認証トークンを送信したことを意味します。 –

+0

これは同じドメインには存在しませんが、現在はそのDNSにドメインコントローラを使用しています。私はそれが何かを意味するかどうかは分かりませんが、ChromeのIISサーバーの「場所」に行くと、Kerberos(すべてのAS/TGS-REQ/REPなど)が使用されているようです。 – dram

+1

もう一度Chromeでもう一度チェックして、NTLMを使用しています!たぶん私は最近何かを変えてしまいました。私はそれを動作させるのに苦労していました。そして、さまざまな設定オプションを試してみました。私はこれがおそらくそれだと言いたい。 – dram

答えて

1

Kerberos認証が機能するには、クライアントマシンがIISサーバーと同じActive Directoryドメインに参加していることを確認してください。 「欠陥のあるトークン」は、一般に、サーバがKerberos認証トークンを要求している間に、クライアントマシンがNTLM認証トークンを送信したことを意味します。このような望ましくない動作が発生する理由があります。

  1. クライアントマシンが同じADドメインに属していない場合は、IISサーバーのドメインとの双方向の信頼関係を持つドメインに存在する必要があります。 ADドメインが同じフォレストにある場合、これはデフォルトで発生します。
  2. 他のドメインからIISサーバーにアクセスするためのアクセス許可を構成する必要があります。要約:これらの質問に対する回答がでない場合は、です。これは、基本認証フォールバックが発生している理由を説明しています。基本認証は、Kerberos認証に失敗した後にのみ試行されます。
0

だから、いくつか確認する必要があります。 @ T-Heronが検証されたことをまず確認してください。それらがあり、まだこれらの事を考慮して動作しない場合:あなたはCMDでコマンドklistを使用して、すべてのKerberosトークンを取得

  1. 検証を。 (IISホストに適合するHTTP/[email protected]エントリが表示されます)
  2. KDCがアクティブで、要求しているサービスを認識していることを確認してください。
  3. IISは、それは(あなたがプログラム的にそれらを設定する場合は、ソースコードまたはこれらの部分)
  4. ダブルあなたはlogin.confとあなたのkrb5.confをチェックするサービスプリンシパルだ知っていることを検証し

これが最善の答えですケルベロスのために私はそれをチェックアウトしてください:SO answer

+0

私はklistを実行し、私はプログラムを走らせてしまったので、そこには誰もいなかった(またはChromeで訪問した後)が、ネットワーク上に1つしかないので、確かにKerberosを使用している(すべてのASとTGSメッセージ)KDCは確実にアクティブであり(IISと話しています)、IISは誰であるかを知っている必要があります(すべてが設定されています - アクティブディレクトリでも確認しています)。 – dram

+0

kerberosトークンのキャッシュにある必要があるかどうかは、not_cachableまたはforwardableとして送信できるのでわかりません。構成これらのファイルのうち、私にもいくつかの神経が必要でした。私はwildflyを使用しているので、自分のjaas設定でセキュリティドメインを持つために実行していた単一ノードの設定を構成する必要がありました。 krb5.confはjava引数としてアプリケーションに渡されます。しかし、これは複数の方法で行うことができます。 – Nico