2010-02-09 123 views
16

我們使用JAAS在使用Windows Kerberos票證緩存的Java應用程序中啓用單一登錄。我們的Jaas.conf配置文件看起來是這樣的:如何根據Java中的服務器驗證Kerberos票證?

LoginJaas { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useTicketCache=true 
    doNotPrompt=true 
    debug=true; 
}; 

有了這個,我們可以創建一個JAAS LoginContext對象,併成功地獲得用戶的Kerberos票據。我們使用JMI將此票證發送出服務器應用程序。但我們無法做到的是在服務器上驗證Kerberos票據實際上是由我們的Active Directory創建的。

目前,我們通過簡單地檢查服務器主體(KerberosTicket.getServer())名稱是否在我們的領域名稱中包含領域名稱來驗證票證。但是,當然,任何人都可以使用相同的域名設置自己的Kerberos服務器,並使用該票證來啓動應用程序。

我發現的一個想法是使用Kerberos票證對Active Directory LDAP進行身份驗證。不幸的是,我們使用Windows 7並且重新使用Kerberos票據來對LDAP進行身份驗證僅適用於設置註冊表項(請參閱http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html,搜索allowtgtsessionkey)。這是我們的用戶無法接受的。

有什麼方法可以根據我們的Active Directory服務器驗證票證嗎?我懷疑有一種方法可以檢查KerberosTicket.getServer()票證是否等於我們服務器的票證,但我不知道該怎麼做。更新:KerberosTicket()。getServer()僅返回一個KerberosPrincipal,其中只包含服務器故障單名稱和領域,所以它不適合進行驗證。

感謝您的幫助, memminger

回答

2

隨着似乎沒有人真正知道一個答案,我想我們必須做出正確的Kerberos服務我們的服務器應用程序。一個登錄到Active Directory本身並具有正確設置的ServicePrincipalName屬性。有點像SPNEGO用於HTTP。如何做到這一點的一個很好的起點是SourceForge上的SPNEGO Servlet過濾器(http://spnego.sourceforge.net/)。 http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html也是如何做服務登錄的一個很好的例子。 不幸的是,這導致與註冊表項相同的問題,所以我在Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API?上發佈了一個新問題。

+0

你有沒有想過這個? – 2014-08-13 00:13:14

5

正如您所提到的,解決此問題的正確方法是通過Kerberos您的服務,這是Kerberos協議的全部要點(根據服務器對客戶端進行身份驗證)。票據重複使用並不完全正確,因爲如果它確實存在安全問題。 Kerberos服務不需要「登錄到Active Directory」,它只需要與AD共享密鑰。

順便說一下,要使用JAAS獲取SSO需要擁有allowtgtsessionkey集,那麼在Windows上就沒有辦法解決這個問題了。

+1

請注意,使用拉丁字符的Active Directory用戶名在JAAS的Kerberos登錄模塊中不起作用。重要的限制,除非系統只有US-ASCII。 – akirekadu 2014-04-03 23:13:46