Аутентификация Java против Active Directory, несоответствие аутентификации?

поэтому у меня есть код, который я тестирую, чтобы убедиться, что он хорошо работает для аутентификации. Он отлично работает против прямого kerberos, поэтому я решил, что с AD должны быть только некоторые незначительные икоты. К сожалению, я не могу обойти KrbException: KDC не поддерживает тип шифрования (14).

Я знаю, что ошибка-несоответствие типа шифрования. Но я могу kinit просто отлично, это только в коде, что я попал в проблему. Я ничего не устанавливаю, поэтому я думаю, что он должен наследовать те же значения по умолчанию, что и kinit, но это, очевидно, не так.

код

System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("java.security.krb5.realm", "TEST.SQRRL.COM");
System.setProperty("java.security.krb5.kdc", "172.16.101.128");
System.setProperty("java.security.auth.login.config", "./conf/jaas.conf");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "true");

// "Client" references the JAAS configuration in the jaas.conf file.
LoginContext loginCtx = null;
loginCtx = new LoginContext("Server", new LoginCallbackHandler("test".toCharArray()));
loginCtx.login();
subject = loginCtx.getSubject();

и jaas.conf

Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
storeKey=true
useTicketCache=true
principal="accumulo@test.SQRRL.COM";
};

и трассировка стека-

>>>KRBError:
     sTime is Tue Nov 27 18:16:36 EST 2012 1354058196000
     suSec is 257213
     error code is 14
     error Message is KDC has no support for encryption type
     realm is test.SQRRL.COM
     sname is krbtgt/test.SQRRL.COM
     msgType is 30
javax.security.auth.login.LoginException: KDC has no support for encryption type (14)
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:696)
    at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
    at javax.security.auth.login.LoginContext.access0(LoginContext.java:186)
    at javax.security.auth.login.LoginContext.run(LoginContext.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
    at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
    at authenticators.KerberosAuthenticator.<init>(KerberosAuthenticator.java:37)
    at main.ServerImpl.<init>(ServerImpl.java:91)
    at main.PlugServer.run(PlugServer.java:22)
    at main.PlugServer.main(PlugServer.java:42)
Caused by: KrbException: KDC has no support for encryption type (14)
    at sun.security.krb5.KrbAsRep.<init>(KrbAsRep.java:66)
    at sun.security.krb5.KrbAsReq.getReply(KrbAsReq.java:446)
    at sun.security.krb5.Credentials.sendASRequest(Credentials.java:401)
    at sun.security.krb5.Credentials.acquireTGT(Credentials.java:373)
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:662)
    ... 15 more
Caused by: KrbException: Identifier doesn't match expected value (906)
    at sun.security.krb5.internal.KDCRep.init(KDCRep.java:133)
    at sun.security.krb5.internal.ASRep.init(ASRep.java:58)
    at sun.security.krb5.internal.ASRep.<init>(ASRep.java:53)
    at sun.security.krb5.KrbAsRep.<init>(KrbAsRep.java:50)
    ... 19 more
Exception in thread "main" java.lang.RuntimeException: javax.security.auth.login.LoginException: KDC has no support for encryption type (14)
    at main.PlugServer.run(PlugServer.java:36)
    at main.PlugServer.main(PlugServer.java:42)
Caused by: javax.security.auth.login.LoginException: KDC has no support for encryption type (14)
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:696)
    at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
    at javax.security.auth.login.LoginContext.access0(LoginContext.java:186)
    at javax.security.auth.login.LoginContext.run(LoginContext.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
    at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
    at authenticators.KerberosAuthenticator.<init>(KerberosAuthenticator.java:37)
    at main.ServerImpl.<init>(ServerImpl.java:91)
    at main.PlugServer.run(PlugServer.java:22)
    ... 1 more
Caused by: KrbException: KDC has no support for encryption type (14)
    at sun.security.krb5.KrbAsRep.<init>(KrbAsRep.java:66)
    at sun.security.krb5.KrbAsReq.getReply(KrbAsReq.java:446)
    at sun.security.krb5.Credentials.sendASRequest(Credentials.java:401)
    at sun.security.krb5.Credentials.acquireTGT(Credentials.java:373)
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:662)
    ... 15 more
Caused by: KrbException: Identifier doesn't match expected value (906)
    at sun.security.krb5.internal.KDCRep.init(KDCRep.java:133)
    at sun.security.krb5.internal.ASRep.init(ASRep.java:58)
    at sun.security.krb5.internal.ASRep.<init>(ASRep.java:53)
    at sun.security.krb5.KrbAsRep.<init>(KrbAsRep.java:50)
    ... 19 more

3 ответов


Итак, я прошел этот этап. Я могу только догадываться, что поддержка DES в active directory для Windows Server 2012 нарушена, поскольку я закончил настройку своего krb5.conf-файл и установка двух типов билетов по умолчанию и разрешенных типов только для aes256-cts-hmac-sha1-96, и это сработало для одного пользователя. После включения aes256 для других пользователей в AD он продолжал работать.


вам необходимо получить доступ к учетной записи пользователя и установите флажок "Использовать типы шифрования kerberos DES".

вам нужно будет войти в свой DS в качестве администратора, чтобы сделать это, конечно.


смотрим init() в KDCRep.java, единственная часть, которая выглядит это может быть бросать вашу ошибку:

    150           if ((subDer.getTag() & 0x1F) == 0x00) {
    151               pvno = subDer.getData().getBigInteger().intValue();
    152               if (pvno != Krb5.PVNO) {
    153                   throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
    154               }
    155           } else {
    156               throw new Asn1Exception(Krb5.ASN1_BAD_ID);
    157           }

кажется немного странным, что ошибка печатается как KrbException, но он может работать с KrbApErrException является наследником KrbException. init() не может бросить любые другие подклассы KrbException, хотя.

нуля, что. Бест возможно, что это один из самых Asn1Exceptionв, с конструктор в KrbAsRep.java ловит и переосмысливает эти ошибки как KrbExceptions (с соответствующим initCause это будет соответствовать довольно хорошо с трассировкой стека).

"Identifier doesn't match expected value (906)" заставляет меня поверить, что это бросает Asn1Exception(Krb5.ASN1_BAD_ID), С Krb5.ASN1_BAD_ID имеет значение 906. Это не слишком полезно, Так как это кажется ошибкой по умолчанию в init().

посмотрите, можете ли вы создать DerValue соответствует вашей конфигурации и проверить его вручную, видя, где init() отклонит его, а затем отступит назад оттуда, глядя на то, какая часть вашей конфигурации создала ошибочные биты.


при дальнейшем осмотре, сообщение "KDC has no support for encryption type" заставляет меня поверить Krb5.KDC_ERR_ETYPE_NOSUPP должно быть, использовался. Но, как это используется только для экземпляра по умолчанию Etype, это может ничего не значить.