2011-02-08 80 views
3

我想創建一個JAVA程序,它將獲得我的Windows用戶憑據,然後連接到我的Unix機器上的Kerberos並進行身份驗證,並允許我使用服務,例如LDAP服務器。使用Java實現的Kerberos SSO

我發現的所有例子都傾向於運行問我的密碼,我不想要這個 - 我希望能夠運行程序和'如果通過魔術'im kerberos驗證。

任何鏈接和例子表示讚賞。

+0

+1如果這對Linux有效,我會更加快樂! – Daniel 2011-02-08 17:12:27

回答

5

我們已經使用Kerberos與Java EE應用程序成功設置了SSO,並在經過數週的測試和網絡爬行後,針對Windows Active Directory進行了身份驗證。

JBOSS談判和春季Kerberos都爲我們工作。但是,這兩組文檔都不夠準確,無法讓您脫穎而出。把簡單的解決方案...

  1. 在Active Directory中創建服務用戶。
  2. 使用ktpass爲該用戶創建一個keytab文件。 (以下列出的許多ktpass陷阱)
  3. 使用setspn -A修復ktpass。
  4. 確保您的krb5.conf(linux)或krb5.ini(windows)是正確的。
  5. 確保您沒有在與服務器相同的盒子上運行客戶端。
  6. 確保您的時間在您的域中保持同步。
  7. 在JDK中使用kinit測試Kerberos。
  8. 將您的Web應用程序配置爲通過提供的過濾器委託身份驗證。
  9. 配置XML文件以使用最初創建的相應服務主體用戶。
  10. 以主要用戶身份運行您的服務!!!!!!!!!
  11. 如果使用Spring,則可以實現UserDetailsS​​ervice來查詢LDAP(活動目錄)並在用戶主體上設置角色。
  12. 在您的應用程序中,用戶主體應該!= null。

的ktpass問題:

  1. 確保您的服務用戶設置爲用戶在Active Directory中不能更改密碼。
  2. 確保您在命令行中提供密碼。
  3. 確保您仍然可以在生成密鑰表之後以該用戶的身份打開命令提示符。
  4. 確保您指定KRB5_NT_PRINCIPAL。
  5. 格式應該是ktpass /out c:\service.keytab /mapuser [email protected] /princ HTTP/[email protected] /pass /ptype KRB5_NT_PRINCIPAL
  6. 添加使用SETSPN -A完全合格的服務主要如下: setspn –A HTTP/hostname.testdomain.server.com userservice
  7. 不要重置服務主要用戶密碼(你將不得不重新生成密鑰表)。

最後,每一個測試前,使用kinit命令清除清除緩存門票。

此外,重複的SPN會嚴重破壞! windows server 2008中的setspn -X會檢測到這個(或者google爲腳本),如果有疑問的時候這樣做,每次都以新的服務用戶和主要名稱重新開始!

希望這可以幫助別人避免我曾經的痛苦。