2017-01-31 29 views
1

私たちは、SPNEGOオーセンティケータ、キータブ、およびSPNを使用して構成されたWindows認証(IWA)を持つTomcat 8アプリケーションを持っています。 ドメインユーザーにとっては問題ありません。Kerberosを使用してユーザーとパスワードの入力を求めずに認証されます。 ドメイン以外のユーザーの場合、ネイティブブラウザポップアップを使用してユーザー名とパスワードを入力して認証を許可します。このケースでは、TomcatがNTLMを使用するはずです。 Hovewer、非ドメインのユーザーは、ブラウザのポップアップにログイン名とパスワードを入力したとき - それが再表示され、Tomcatのログに例外がある:私の場合はドメイン以外のユーザーのためのTomcat 8およびWindows NTLM認証

int var2 = decodedHeader.read(); 
     if(var2 != 96) { 
      throw new GSSException(10, -1, "GSSHeader did not find the right tag"); 

:GSSHeaderのピースofcodeは

2017-01-24 05:15:46,910 [http-nio-127.0.0.1-8455-exec-9] DEBUG org.apache.catalina.authenticator.SpnegoAuthenticator- Unable to login as the service principal 
java.security.PrivilegedActionException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) 
       at java.security.AccessController.doPrivileged(Native Method) 
       at javax.security.auth.Subject.doAs(Subject.java:422) 
       at org.apache.catalina.authenticator.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:230) 
       at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:577) 
       at com.avaya.cas.auth.authenticator.IViewTokenAuthenticator.invoke(IViewTokenAuthenticator.java:212) 
       at com.avaya.cas.ssl.valves.SSLValve.invoke(SSLValve.java:84) 
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
       at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240) 
       at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:676) 
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
       at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
       at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
       at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527) 
       at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484) 
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
       at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
       at java.lang.Thread.run(Thread.java:745) 
Caused by: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) 
       at sun.security.jgss.GSSHeader.<init>(GSSHeader.java:97) 
       at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306) 
       at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) 
       at org.apache.catalina.authenticator.SpnegoAuthenticator$AcceptAction.run(SpnegoAuthenticator.java:323) 
       at org.apache.catalina.authenticator.SpnegoAuthenticator$AcceptAction.run(SpnegoAuthenticator.java:310) 
       ... 20 more 

ありvar2は78( 'N' char)です。 decodedHeader-は、認証ヘッダーのブラウザから送信される標準的な最初のNTLMメッセージです。 私のケースでは、次のとおりです。

認証:それはのようなものになります 'NTLMSSP ...バイナリデータ...' デコードした後TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKADk4AAAADwの==

を交渉します。 したがって、このメッセージの最初のバイトは、Tomcatのコードが期待しているように、常に 'N'(78)ですが、96ではありません。

TomcatはNTLM認証をサポートしていますか?ドメインユーザーは認証されているので、非常に奇妙です(提供されたキータブを使用して、Tomcatがユーザーからのチャレンジを解読できることを意味します)。

答えて

2

ここにSPNEGOコードの寄付者がいます。

GSSHeader did not find the right tagは、クライアントによってSPNEGOトークンが送信されていないことを意味します(you receive a pure NTLM token)。これは、Kerberosが何らかの理由で失敗した場合に発生します。

NTLMは非常に異なり、非常に独占的です。この場合、サーバーはハッシュをクライアントからドメインコントローラに渡す中間的な役割を果たします。サーバーはそれ自体は何もできません。 Tomcatが何かを解読する方法はありませんwithout the help of a domain controller。また、Sambaの内部コードを除いて、オープンソースとして(特にJavaではなく)利用可能なNTLMサーバ側の実装は知られていません。

アップショット:forget about NTLMと私はhereをお勧めします。

注:このようなシナリオではIAKERBが存在しますが、MIT KerberosとHeimdalのみがサポートしています。

+1

フム、私は基本認証は、その場合には助けることができることをわからないんだけど(それはそう、それはあなたの推薦であること) C - > S: - 、ネゴシエート:401 WWW認証S GETリソース C <基本 ユーザーがログインとパスワードを入力するようにブラウザにプロンプ​​トが表示されます。ユーザーは正しいログインとパスワードを入力します C - > S:GETリソース認証:ネゴシエート C < - S:401 WWW認証:基本 ブラウザは再度プロンプトを表示し、ユーザーは再度ログインとパスワードを入力します C - > S: GETリソース認証:基本 C < - S:200 その場合、ユーザーは同じログインとパスワードを2回入力するように求められます。 – EvilOrange

+1

資格情報がポップアップすると、 IEはFirefoxとはまったく異なる振る舞いをしています。これはあなたのベストショットです。あるいは、リモートIPを選択することもできますが、範囲がわかっていれば、適切なヘッダーを提供することができます。 –

関連する問題