本当にまっすぐなことがあればお詫び申し上げます。私はこれに間違っています。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の認証を行った人は誰ですか(人の例 - 実際には見つからないようですか)?
私はちょうどあなたの質問に投票した人でした。素晴らしい詳細。さて、私はあなたに質問しました:あなたは2つのVMを持っていたと言いました。最初はActive Directoryドメインコントローラで、もう1つは実行中のIISサーバーです。あなたのクライアントマシンもこのActive Directoryドメインに参加していますか? Kerberos認証が機能する必要があります。 「欠陥のあるトークン」は、一般に、サーバがKerberos認証トークンを要求している間に、クライアントマシンがNTLM認証トークンを送信したことを意味します。 –
これは同じドメインには存在しませんが、現在はそのDNSにドメインコントローラを使用しています。私はそれが何かを意味するかどうかは分かりませんが、ChromeのIISサーバーの「場所」に行くと、Kerberos(すべてのAS/TGS-REQ/REPなど)が使用されているようです。 – dram
もう一度Chromeでもう一度チェックして、NTLMを使用しています!たぶん私は最近何かを変えてしまいました。私はそれを動作させるのに苦労していました。そして、さまざまな設定オプションを試してみました。私はこれがおそらくそれだと言いたい。 – dram