По сути, в моей среде есть Active Directory (UAT). я пытался подключиться к нему локально и с помощью простых программ Java
у меня есть учетная запись под названием rikim в моем AD
я создал для него SPN (не уверен) это для чего) просто следуйте инструкциям
Это снимок экрана в моей конфигурации AD для SPN
после создания SPN, затем я попытался создать keytab для моей учетной записи
с помощью этой команды
ktpass /out C:\Keys\oneapp.keytab /mapuser UMWTDEV\rikim /princ
HTTP/NSEADFS101.UMWTDEV.MY@UMWTDEV.MY /pass somepassword /ptype
KRB5_NT_PRINCIPAL /crypto Все
Еще информация:
- NSEADFS101.UMWTDEV.MY это мои домены активного каталога
- Я пытаюсь подключиться со своего локальный ПК (в настоящее время входит в систему AD)
- Пытаюсь создать простые программы POC на Java, чтобы доказать, что аутентификацию можно выполнить в AD UAT с использованием Kerberos и согласования токена. возможно ли это?
Код: Выделить всё
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();
}
}
Что делать дальше? как мне получить действительный токен 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;
};
Код: Выделить всё
[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 ... to-extract
Мобильная версия