gpt4 book ai didi

java - Keytab 和 KDC 中使用 JAAS 的 Kerberos 用户主体

转载 作者:行者123 更新时间:2023-12-02 04:30:17 32 4
gpt4 key购买 nike

我正在构建一个简单的 Jaas 登录模块。这使用以下代码:

public class Jaas {
private static String name;
private static final boolean verbose = false;

public static void main(String[] args) throws Exception {
if (args.length > 0) {
name = args[0];
} else {
name = "client";
}

// Create action to perform
PrivilegedExceptionAction action = new MyAction();

loginAndAction(name, action);
}

static void loginAndAction(String name, PrivilegedExceptionAction action)
throws LoginException, PrivilegedActionException {

// Create a callback handler
CallbackHandler callbackHandler = new TextCallbackHandler();

LoginContext context = null;

try {
// Create a LoginContext with a callback handler
context = new LoginContext(name, callbackHandler);

// Perform authentication
context.login();
} catch (LoginException e) {
System.err.println("Login failed");
e.printStackTrace();
System.exit(-1);
}

// Perform action as authenticated user
Subject subject = context.getSubject();
if (verbose) {
System.out.println(subject.toString());
} else {
System.out.println("Authenticated principal: " +
subject.getPrincipals());
}

Subject.doAs(subject, action);

context.logout();
}

// Action to perform
static class MyAction implements PrivilegedExceptionAction {
MyAction() {
}

public Object run() throws Exception {
// Replace the following with an action to be performed
// by authenticated user
System.out.println("Performing secure action ...");
return null;
}
}
}

这是使用以下命令运行的:

java -Djava.security.auth.login.config=jaas-krb5.conf Jaas client

jaas-krb5:

client{
com.sun.security.auth.module.Krb5LoginModule required
principal="name@Host.COM";
};
server{
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
KeyTab=myKeyTab.keytab
principal="host.name.com";
};

在 myKeyTab 中,我们有以下原则:

slot KVNO Principal
---- ---- ---------------------------------------------------------------------
1 4 name@Host.COM

所以我已经编译并运行,但登录时总是出现错误:

Kerberos password for name@Host.COM: //I enter the password
Login failed

使用堆栈跟踪:

javax.security.auth.login.LoginException: Cannot get kdc for realm Host.COM
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.access$000(LoginContext.java:186)
at javax.security.auth.login.LoginContext$4.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 Jaas.loginAndAction(Jaas.java:77)
at Jaas.main(Jaas.java:61)
Caused by: KrbException: Cannot get kdc for realm Host.COM
at sun.security.krb5.KrbKdcReq.send(KrbKdcReq.java:195)
at sun.security.krb5.KrbKdcReq.send(KrbKdcReq.java:174)
at sun.security.krb5.KrbAsReq.send(KrbAsReq.java:431)
at sun.security.krb5.Credentials.sendASRequest(Credentials.java:400)
at sun.security.krb5.Credentials.acquireTGT(Credentials.java:350)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:662)

我的问题是:

我认为我对 KDC/Keytab 和用户条目之间发生的情况存在根本性误解。我的理解是,主体是验证的对象,如果是这样,我如何输入新的主体并分配密码?

我的目标是简单地将测试主体添加到 key 表并使用它来运行此登录脚本。

最佳答案

看来您做出了一个错误的假设。

主体是用户名+ Kerberos 领域(或 Activity 目录域)。该值可能与 DNS 域相同,也可能不同。但从根本上来说,它们是完全不同的东西。在您的特定情况下,您的 kerberos 领域似乎是 intranet.barcapint.com。但是,您的 key 表包含 name@host.com 的 key 。因此,Jaas Kerberos 客户端会忽略 key 表中的内容并回退到默认领域分辨率。而且您的领域到域的映射似乎已损坏,因此它无法找到 KDC 并且失败并出现上述错误。因此你得到了内部异常。

要解决上述所有问题,首先您需要修复域到领域的映射。如何执行取决于操作系统。在 Unix 系统上,您应该检查 /etc/krb5.conf,在 Windows 上,它是 c:\windows\krb5.ini。但它可能在其他地方。检查this了解更多信息。

另一件事是,您只需要无人值守服务器的 key 表。这只是存储 kerberos key 的便捷方法。我建议首先像上面那样使用 textcallback 让服务器和客户端工作。获得此信息后,您可以继续使用服务器的 key 表。

关于java - Keytab 和 KDC 中使用 JAAS 的 Kerberos 用户主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565909/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com