我正在构建一个简单的Jaas loginmodule。这使用以下代码:
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
使用stacktrace:
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与用户条目之间发生的事情存在根本的误解。我的理解是,校长是经过验证的,如果是,我该如何输入新的校长并分配密码?
我的目标是简单地将一个测试主体添加到keytab,并使用它来运行此日志脚本。
答案 0 :(得分:2)
看起来你做了一个不正确的假设。
Principal是username + Kerberos realm(或活动目录域)。这可能与DNS域的值相同,也可能不同。但从根本上说,它们是完全不同的东西。在您的特定情况下,您的kerberos领域看起来像intranet.barcapint.com
。但是,您的keytab包含name@host.com
的密钥。因此,Jaas Kerberos客户端会忽略keytab中的内容并回退到默认领域分辨率。而且看起来你的领域映射领域已被打破,因此无法找到KDC并因上述错误而失败。因此你得到内在的例外。
要解决上述所有问题,首先需要将域修复为域映射。如何操作取决于操作系统。在Unix系统上,您应该在Windows上/etc/krb5.conf
检查它是c:\windows\krb5.ini
。但它可能在其他地方。查看this了解详情。
另一件事是,您只需要无人值守服务器的keytabs。这是存储kerberos密钥的便捷方式。我建议你首先让服务器和客户端像上面一样使用textcallback。获得此功能后,您可以继续使用服务器的keytab。