У меня есть учетная запись под названием 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 и токена согласования. Возможно ли это?
Код: Выделить всё
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();
}
}
Это мой файл 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
Подробнее здесь: https://stackoverflow.com/questions/791 ... ct-the-use
Мобильная версия