GSSContext с нулевым SrcName
Я работаю над веб-приложением с помощью единого входа на основе имени входа в домен Windows, для этого я выбрал проверку билетов Kerberos. Но сейчас я столкнулся с проблемой, для которой не могу найти решение. Мне удается проверить заявку без исключений, но когда я пытаюсь получить имя пользователя,NullPointerException
брошен, потому что имя пользователяnull
и я не знаю, где проблема.
Почему имя пользователя пустое, если я не получаю никаких исключений во время проверки?
Как я получу имя пользователя:String clientName = gssContext.getSrcName().toString();
Я создаю свой клиент на основе этого:
Использование GSSManager для проверки билета Kerberos
Как получить билет службы Kerberos через GSS-API?
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html
Обновление 1:
Как я настраиваю контент, просто скопируйте и вставьте форму здесьhttps://stackoverflow.com/a/25450862/1646082:
final Oid spnegoOid = new Oid("1.3.6.1.5.5.2");
GSSManager gssmgr = GSSManager.getInstance();
// tell the GSSManager the Kerberos name of the service
GSSName serviceName = gssmgr.createName(this.servicePrincipal, GSSName.NT_USER_NAME);
// get the service's credentials. note that this run() method was called by Subject.doAs(),
// so the service's credentials (Service Principal Name and password) are already
// available in the Subject
GSSCredential serviceCredentials = gssmgr.createCredential(serviceName,
GSSCredential.INDEFINITE_LIFETIME, spnegoOid, GSSCredential.ACCEPT_ONLY);
// create a security context for decrypting the service ticket
GSSContext gssContext = gssmgr.createContext(serviceCredentials);
// decrypt the service ticket
System.out.println("Entering accpetSecContext...");
System.out.println( new String (Base64.encodeBase64( gssContext.acceptSecContext(this.kerberosTicket, 0,
this.kerberosTicket.length) ) ));
// get the client name from the decrypted service ticket
// note that Active Directory created the service ticket, so we can trust it
String clientName = gssContext.getSrcName().toString();
Обновление 2:
Если я настрою весеннюю безопасность на основе этогоhttps://spring.io/blog/2009/09/28/spring-security-kerberos-spnego-extension я также получил ту же ошибку:
java.lang.NullPointerException в org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator $ KerberosValidateAction.run (SunJaasKerberosTicketValidator.java:136) в org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator $ KerberosValidateAction.run (SunJaasKerberosTicketValidator.java:125 ) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422)
private static class KerberosValidateAction implements PrivilegedExceptionAction<String> {
byte[] kerberosTicket;
public KerberosValidateAction(byte[] kerberosTicket) {
this.kerberosTicket = kerberosTicket;
}
@Override
public String run() throws Exception {
GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
String user = context.getSrcName().toString(); // ERROR!
context.dispose();
return user;
}
}
Обновление 3:
Также попытался изменить версию Java с 1.8 до 1.7, как предложено здесьСбой аутентификации домена с помощью Kerberos, Безрезультатно.
Обновление 4:
Прежде всего. Не используйте Java 1.8 b40 и b45, они оба сломаны. И не тестируйте его на локальном ПК, он не работает (я не знаю почему).
После перехода на новейшую (b65) версию Java я получил исключение по поводу надписи (не удается найти ключ соответствующего типа для расшифровки AP REP - AES256 ...). Это я исправил с помощью Java Cryptography Extension (JCE) для Java 1.8 и заново создаю keytab с помощью/crypto AES256-SHA1
после всего этого я получил исключение:
GSSException: ошибка, не указанная на уровне GSS-API (уровень механизма: контрольная сумма не удалась) в sun.security.jgss.krb5.Krb5Context.acceptSecContext (неизвестный источник) в sun.security.jgss.GSSContextImpl.acceptSecContext (неизвестный источник) в sun. .jgss.GSSContextImpl.acceptSecContext (Неизвестный источник) в GssServer $ GssServerAction.run (GssServer.java:159) ... ... еще 4 Причина: KrbException: Сбой контрольной суммы в sun.security.krb5.internal.crypto.Arptyc ( Неизвестный источник) в sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt (Неизвестный источник) в sun.security.krb5.EncryptedData.decrypt (Неизвестный источник) в sun.security.krb5.KrbApReq.authenticate (Неизвестный источник) sun.security.krb5.KrbApReq. (Неизвестный источник) at sun.security.jgss.krb5.InitSecContextToken. (Неизвестный источник) ... еще 8 Причин: java.security.GeneralSecurityException: контрольная сумма не удалась в sun.security.krb5. internal.crypto.dk.ArcFourCrypto.decrypt (Неизвестный источник) в sun.security.krb5.internal.crypto.ArcFourHmac.decrypt (Unk Неизвестный источник) ... еще 14
Я старалсяэтот урок и другой способ создания keytabfile, но у меня до сих пор нет решения.