2017-01-31 73 views
1

我們擁有帶有SPNEGO身份驗證器,密鑰表和SPN的配置Windows身份驗證(IWA)的Tomcat 8應用程序。 它適用於域用戶 - 它們在不提示用戶和密碼的情況下使用Kerberos進行身份驗證。 對於非域用戶,我們希望通過使用本地瀏覽器彈出窗口輸入用戶名和密碼來進行身份驗證。看來,這個tomcat應該使用NTLM。 Hovewer,當非域用戶輸入登錄名和密碼瀏覽器彈出 - 它再次出現並且在Tomcat的日誌例外:非域用戶的Tomcat 8和Windows NTLM身份驗證

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 

有GSSHeader的一塊ofcode:

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

var2是78('N'char) decodeHeader-是一個非標準的第一個NTLM消息,它是從授權頭中的瀏覽器發送的。 在我的情況是:

授權:協商TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKADk4AAAADw ==

解碼它會像 '後NTLMSSP ...二進制數據...'。 所以,這個消息的第一個字節總是'N'(78),但不是96,正如Tomcat的代碼所期望的那樣。

Tomcat是否支持NTLM身份驗證?這很奇怪,因爲Domain用戶可以被認證(這意味着Tomcat可以使用提供的keytab解密用戶的挑戰)

回答

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的內部代碼之外,還沒有已知的NTLM服務器端實現可用作開源(尤其不在Java中)。

Upshot:forget about NTLM並做我推薦的here

注意:這種情況下有IAKERB,但只有MIT Kerberos和最多Heimdal支持它。

+1

嗯,我不知道是基本身份驗證可能會在這種情況下幫助(現在看來,這是你的建議) Ç - > S:GET資源 ç< - S:401 WWW身份驗證:協商,基本型 瀏覽器顯示提示用戶輸入登錄名和密碼。用戶輸入正確的登錄名和密碼 C - > S:GET資源授權:協商 C < - S:401 WWW-Authenticateion:Basic 瀏覽器再次顯示提示,用戶再次輸入登錄名和密碼, C - > S: GET資源Authorziation:Basic <登錄名:密碼> C < - S:200 因此,在這種情況下,系統會提示用戶輸入相同的登錄名和密碼兩次 – EvilOrange

+1

也許這是真的,當它彈出憑據時,它由客戶端決定。 IE將明確表現出與Firefox不同的行爲,我試過了。這是你擁有的最好的鏡頭。或者,你當然可以選擇遠程IP,如果你知道你的範圍,你可以提供適當的頭文件。 –