Как Kerberos, keytab и согласование работают в Java. Как я могу извлечь информацию о пользователе или проверить его учетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как Kerberos, keytab и согласование работают в Java. Как я могу извлечь информацию о пользователе или проверить его учет

Сообщение Anonymous »

Может ли кто-нибудь объяснить мне, как работают Kerberos, keytab и токен согласования? У меня есть Active Directory (UAT) в моей среде. Я попытался подключиться к нему на своем локальном компьютере с помощью простой программы Java.
У меня есть учетная запись под названием rikim в AD. Я создал для него SPN (не знаю для чего), просто следуя инструкциям.
Это снимок экрана в моей конфигурации AD для SPN
После создания SPN я попытался создать вкладку ключей для своей учетной записи с помощью этой команды:

Код: Выделить всё

ktpass /out C:\Keys\oneapp.keytab /mapuser UMWTDEV\rikim /princ HTTP/NSEADFS101.UMWTDEV.MY@UMWTDEV.MY /pass somepassword /ptype KRB5_NT_PRINCIPAL /crypto All
Дополнительная информация:
  • NSEADFS101.UMWTDEV.MY — мой домен активного каталога.
  • Я пытаюсь подключиться со своего локального компьютера (в настоящее время вхожу в систему AD Production)
  • Я пытаюсь создать простую программу POC на Java, чтобы доказать это аутентификацию можно выполнить в AD UAT с использованием Kerberos и токена согласования. Возможно ли это?
Это моя простая программа на Java. Я всегда получаю значение GSSCONTEXT null (как я могу узнать, какой пользователь вошел в систему, на основе токена SPNEGO?)

Код: Выделить всё

public class Main {

public static void main(String[] args) {
// Set system properties for Kerberos configuration
System.setProperty("java.security.krb5.conf", "C:/Windows/krb5.conf"); // Path to krb5.conf
System.setProperty("java.security.auth.login.config", "C:/Windows/jaas.conf"); // Path to jaas.conf
System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); // Allow use of credentials outside the subject
System.setProperty("sun.security.krb5.disableReferrals", "true"); // Disable DNS canonicalization to avoid suffix issues

try {
// Authenticate using LoginContext and JAAS
LoginContext loginContext = new LoginContext("com.sun.security.jgss.krb5.initiate");
loginContext.login();

System.out.println("Login context succesfully");

// Generate SPNEGO token in the authenticated subject's context
Subject.doAs(loginContext.getSubject(), (PrivilegedExceptionAction) () -> {
generateSpnegoToken();
return null;
});

loginContext.logout();
} catch (LoginException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

private static void generateSpnegoToken() throws GSSException {
// Initialize the GSSManager
GSSManager gssManager = GSSManager.getInstance();

// Define the SPNEGO OID
Oid spnegoOid = new Oid("1.3.6.1.5.5.2");

// Create a GSSName for the target service
String servicePrincipal = "HTTP/NSEADFS101.UMWTDEV.MY@UMWTDEV.MY";
GSSName serviceName = gssManager.createName(servicePrincipal, GSSName.NT_HOSTBASED_SERVICE);

// Create a GSSContext for the client
GSSContext gssContext = gssManager.createContext(
serviceName,
spnegoOid,
null,
GSSContext.DEFAULT_LIFETIME
);

// Set desired context options
gssContext.requestMutualAuth(true); // Request mutual authentication
gssContext.requestCredDeleg(true);  // Request credential delegation

// Initialize the security context
byte[] token = new byte[0];
token = gssContext.initSecContext(token, 0, token.length);

// Encode the token in Base64 for use in HTTP headers
if (token != null) {
String spnegoToken = Base64.getEncoder().encodeToString(token);
System.out.println("SPNEGO Token: " + spnegoToken);
} else {
System.out.println("No token generated.");
}

if (gssContext.isEstablished()) {
// Retrieve the authenticated client's principal name
System.out.println("Authenticated Client Principal: " + gssContext.getSrcName().toString());
} else {
System.out.println("GSSContext not established.");
}

// Dispose of the context when done
gssContext.dispose();
}
}
Мне удалось сделать loginContext.login(); успешно, то есть я прошел аутентификацию с помощью моей таблицы ключей, указанной в jaas.conf, верно? Что делать дальше? Как мне получить действительный токен spnego и проверить его?
Это мой файл jaas.conf

Код: Выделить всё

com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
debug=true
useKeyTab=true
keyTab="C:/Windows/oneapp.keytab"
principal="HTTP/NSEADFS101.UMWTDEV.MY@UMWTDEV.MY"
storeKey=true
doNotPrompt=true
useTicketCache=false;
};
также krb5.conf

Код: Выделить всё

[libdefaults]
default_realm = UMWTDEV.MY
default_tkt_enctypes = aes256-cts aes128-cts rc4-hmac
default_tgs_enctypes = aes256-cts aes128-cts rc4-hmac
permitted_enctypes = aes256-cts aes128-cts rc4-hmac
default_keytab_name = FILE:C:\\Windows\\oneapp.keytab
forwardable = true
default_ccache_name = C:/Users/rikim/krb5cc_rikim

[realms]
UMWTDEV.MY = {
kdc = nseadfs101.umwtdev.my
admin_server = nseadfs101.umwtdev.my
default_domain = UMWTDEV.MY
}

[domain_realm]
.umwtdev.my = UMWTDEV.MY
umwtdev.my = UMWTDEV.MY
Я не совсем понимаю, как это работает, может кто-нибудь объяснить? Кроме того, на моей стороне отсутствует какая-либо конфигурация или возможно ли заставить пользователя проверить учетные данные на основе передаваемого им токена SPNEGO.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ct-the-use
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»