LDAP使用GSSAPI在Java的子领域/跨领域设置中创建InitialLdapContext失败

LDAP使用GSSAPI在Java的子领域/跨领域设置中创建InitialLdapContext失败,java,ldap,kerberos,gssapi,Java,Ldap,Kerberos,Gssapi,我有一个服务器进程在KERBOS.COM上运行,它试图连接到in.KERBOS.COM(子领域)中的LDAP服务器,以使用GSSAPI机制同步用户 通过查看GSSLOG,我们可以看到 试图进行身份验证的spn属于KERBOS.COM ldap/invr28ppqa36.in.KERBOS。com@KERBOS.COM 这有没有办法让它选择IN.KERBOS.COM作为领域 env.put(Context.PROVIDER_URL, String.format("ldap://%s:%d", ho

我有一个服务器进程在KERBOS.COM上运行,它试图连接到in.KERBOS.COM(子领域)中的LDAP服务器,以使用GSSAPI机制同步用户

通过查看GSSLOG,我们可以看到
试图进行身份验证的spn属于KERBOS.COM ldap/invr28ppqa36.in.KERBOS。com@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);
} });
默认领域必须是krb5.conf中的KERBOS.COM。因此,将默认领域更改为IN.KERBOS.COM不是一个选项

我也给它起了一个完全限定的名字,所以应该有办法告诉它在.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);
} });
env.put(Context.PROVIDER_URL,String.format(“ldap://%s:%d”,主机,端口));
主题=新主题();
subject.getPrivateCredentials().add(凭证);
InitialLdapContext对象=Subject.doAs(Subject,新的PrivilegedExceptionAction(){
public InitialLdapContext run()引发异常{
环境put(Context.SECURITY_认证,“GSSAPI”);
返回新的InitialLdapContext(env,null);
} });
日志

Subject.doAs fails by throwing an exception (Intercept from Logs are given)
Found ticket for **sysadmin@IN.KERBOS.COM to go to krbtgt/IN.KERBOS.COM@IN.KERBOS.COM**  Credentials acquireServiceCreds: obtaining service creds for **ldap/invr28ppqa36.in.kerbos.com@KERBOS.COM**
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)
Subject.doAs因引发异常而失败(给出了日志截获)
找到**sysadmin@IN.KERBOS.COM转到krbtgt/IN.KERBOS。COM@IN.KERBOS.COM**凭据acquireServiceCreds:获取**ldap/invr28ppqa36.in.kerbos的服务凭据。com@KERBOS.COM**
使用默认类型的内置默认etype
默认类型的默认类型:17 16 23 1 3。
KrbException:无法创建凭据。(63)-无服务信誉
位于sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:301)
位于sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:442)
位于sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:641)
位于sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248)
位于sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
位于com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:193)
位于com.sun.jndi.ldap.sasl.LdapSasl.saslBind(LdapSasl.java:123)
位于com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:232)
位于com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2740)
位于com.sun.jndi.ldap.LdapCtx(LdapCtx.java:316)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:211)
位于com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
位于com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
位于javax.naming.InitialContext.init(InitialContext.java:242)
位于javax.naming.ldap.InitialLdapContext。(InitialLdapContext.java:153)
at(LDAPConnector.java:101)

默认情况下,Kerberos实现将从客户端领域的KDC开始,希望KDC能够提供对服务领域的跨领域引用。因此,您在EXAMPLE.COM中有一个票证,您将访问一个名为server.subdomain.EXAMPLE.COM的主机。您的客户机应该访问EXAMPLE.COM KDC。KDC可以说它知道如何给你一张服务票,或者可以给你一张特别推荐票,让你更接近服务;在本例中,您可能希望它为您提供一个krbtgt/SUBDOMAIN.example。COM@EXAMPLE.COM王国。这会告诉您的客户端转到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

请参见讨论krb5.conf的示例,其中包括Java中的domain_realm部分。请参阅,以了解转介工作的技术细节。

谢谢,我找到了答案myself@DeepakKumar:你能帮忙吗?你是怎么解决的。我也有同样的问题。