Ошибка создания LDAP InitialLdapContext в настройке Sub Realm / Cross Realm в Java с использованием GSSAPI

У меня есть серверный процесс, запущенный на машине KERBOS.COM, и он пытается подключиться к серверу LDAP в IN.KERBOS.COM (Sub Realm) для синхронизации пользователя с использованием механизма GSSAPI.

Посмотрев на GSSLOGS, мы можем увидеть, что spn, который пытается аутентифицировать, принадлежит KERBOS.COM ldap/[email protected]. Это какой-либо способ заставить его выбрать IN.KERBOS.COM в качестве области .

Область по умолчанию должна быть KERBOS.COM в krb5.conf. Поэтому изменение области по умолчанию на 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)

person Deepak Kumar    schedule 04.10.2013    source источник


Ответы (1)


По умолчанию реализация Kerberos запускается в KDC клиентской области, надеясь, что KDC сможет предоставить перекрестную ссылку на область службы. Итак, у вас есть билет в EXAMPLE.COM, и вы собираетесь на хост с именем server.subdomain.example.com. Ваш клиент должен перейти на EXAMPLE.COM KDC. Этот KDC может либо сказать, что он знает, как дать вам служебный билет, либо может дать вам специальный реферальный билет, чтобы приблизиться к службе; в этом примере можно ожидать, что он предоставит вам область krbtgt/[email protected]. Это говорит вашему клиенту перейти на KDC subdomain.example.com.

По-видимому, ваш KDC KERBOS.COM не знает, что ваш сервер 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, включая разделы domain_realm в Java. См. RFC 6806 для технических подробностей о том, как должны работать рефералы.

person Sam Hartman    schedule 19.11.2013
comment
Спасибо я сам придумал ответ - person Deepak Kumar; 19.12.2013
comment
@DeepakKumar: Не могли бы вы помочь, как вы решили это. У меня такая же проблема. - person Aman; 22.03.2019