2013-10-04 62 views
3

失敗我有一臺服務器進程運行在一臺計算機上KERBOS.COM並試圖連接到IN.KERBOS.COM(Sub領域)中的LDAP服務器使用GSSAPI機制同步用戶。LDAP創建InitialLdapContext在使用GSSAPI在Java中的Sub領域/跨領域設置

通過查看GSSLOGS我們可以看到,
的SPN其試圖屬於KERBOS.COM ldap/[email protected] 驗證這是沒有辦法讓它挑IN.KERBOS .COM作爲領域。

缺省領域必須是krb5.conf中的KERBOS.COM。因此,將默認領域更改爲IN.KERBOS.COM不是一種選擇。

我也給它一個完全限定的名字,所以應該有一些方法告訴它使用IN.KERBOS.COM作爲領域。

env.put(Context.PROVIDER_URL, String.format("ldap://%s:%d", host, port)); 

Subject subject = new Subject(); 
subject.getPrivateCredentials().add(credential); 
InitialLdapContext object = Subject.doAs(subject, new PrivilegedExceptionAction<InitialLdapContext>() { 
    public InitialLdapContext run() throws Exception {         
    env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI"); 
    return new InitialLdapContext(env, null); 
} }); 

日誌

Subject.doAs fails by throwing an exception (Intercept from Logs are given) 
Found ticket for **[email protected] to go to krbtgt/[email protected]** Credentials acquireServiceCreds: obtaining service creds for **ldap/[email protected]** 
Using builtin default etypes for default_tgs_enctypes 
default etypes for default_tgs_enctypes: 17 16 23 1 3. 
KrbException: Fail to create credential. (63) - No service creds 
    at sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:301) 
    at sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:442) 
    at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:641) 
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248) 
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179) 
    at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:193) 
    at com.sun.jndi.ldap.sasl.LdapSasl.saslBind(LdapSasl.java:123) 
    at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:232) 
    at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2740) 
    at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:316) 
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193) 
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:211) 
    at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154) 
    at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84) 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) 
    at javax.naming.InitialContext.init(InitialContext.java:242) 
    at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:153) 
    at (LDAPConnector.java:101) 

回答

2

默認情況下一個Kerberos實現將在客戶端領域的KDC開始,希望KDC可以提供跨領域推薦到服務領域。所以,你在EXAMPLE.COM中有一張票,你要去一個叫做server.subdomain.example.com的主機。你的客戶應該去EXAMPLE.COM KDC。 KDC可以說它知道如何給你一張服務票,或者可以給你一個特殊的推薦票以接近服務;在這個例子中,你會期待它給你一個krbtgt/[email protected]領域。這會告訴您的客戶轉到subdomain.example.com KDC。

顯然,您的KERBOS.COM KDC不知道您的LDAP服務器是由IN.KERBOS.COM域服務的。解決問題的一種方法是修復KDC。這將取決於您擁有的KDC軟件。或者,您可以編輯您的krb5.conf並告訴您的客戶端,in.kerbos.com下的所有內容均由IN.KERBOS.COM KDC提供。添加部分類似下面您的krb5.conf:

[domain_realm] 
.in.kerbos.com = IN.KERBOS.COM 

this作爲討論的krb5.conf包括在Java中domain_realm部的實例。請參閱RFC 6806以瞭解推介如何運作的技術細節。

+0

謝謝我自己想出了答案 –