首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的kerberos -为当前通过身份验证的用户获取一个主题

Java中的kerberos -为当前通过身份验证的用户获取一个主题
EN

Stack Overflow用户
提问于 2009-06-11 08:07:23
回答 1查看 11K关注 0票数 6

我们公司有一个kerberos域,我正在运行一些Java/Kerberos 示例。我的问题是从服务器的角度来看登录机制。在运行服务器示例GssServer.java时,我需要获得一个javax.security.auth.Subject;在提供的代码中,这是通过LoginContext获得的,因此:

代码语言:javascript
复制
// Create a LoginContext with a callback handler and login
LoginContext context = new LoginContext(name, new TextCallbackHandler());
context.login();

Subject subject = context.getSubject();

这一切都很好,当我运行这个示例时,我会看到一个可爱的登录提示。然而,我的问题是,这是,而不是,实际上我的服务器将如何运行,我也不知道如何从kerberos域中呈现服务。在GssServer示例中,问题是我的服务器(read: service)应该不需要向KDC认证自己()才能将其服务呈现给客户端。访问服务器端keytab文件应该就足够了。因此,对于示例配置:

代码语言:javascript
复制
//jaas-krb5.conf
server {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/home/myusr/my-server.keytab"
    principal="myserv/mymachine.some.domain";
};

在Java代码中:

代码语言:javascript
复制
GSSManager manager = GSSManager.getInstance();
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName gssName = manager.createName("myserv/mymachine.some.domain@THE.REALM.COM", 
                                     GSSName.NT_HOSTBASED_SERVICE);
GSSCredential serverCreds = manager.createCredential(gssName,
                                     GSSCredential.DEFAULT_LIFETIME,
                                     krb5Mechanism,
                                     GSSCredential.ACCEPT_ONLY);

问题在于,除非我通过行验证自己,否则jaas-krb5.conf文件中的jaas-krb5.conf信息是不可用的:

代码语言:javascript
复制
Jaas.loginAndAction("server", action);     

我不应该通过这个认证!但如果我不证明自己的身份,我最终会:

代码语言:javascript
复制
Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73)
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77)
    at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149)
    at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389)
    at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45)
    at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102)
    at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79)
    at gsa.hk.GssServer.main(GssServer.java:57)
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept
    at javax.security.auth.login.LoginContext.init(LoginContext.java:256)
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
    at sun.security.jgss.LoginUtility.login(LoginUtility.java:72)
    at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205)
    at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181)
    ... 8 more

有问题也就不足为奇了。毕竟,除非我掌握了server主题,否则我怎么知道我的keytab在哪里,或者我正在提供什么服务?

因此,我的问题是:如何在不使用代码验证自己的情况下告诉关于keytab/服务的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-15 11:58:05

好的。因此,假设您知道可以使用文件而不是身份验证,那么这将是非常容易的。这一点在JavaDoc for Krb5LoginModule中有所概述。

基本上,如果我

代码语言:javascript
复制
loginAndAction("anything", action)

那么我的配置应该如下所示:

代码语言:javascript
复制
//jaas-krb5.conf
anything {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    doNotPrompt=true
    keyTab="/home/myusr/my-server.keytab"
    principal="myserv/mymachine.some.domain";
};

重要的是doNotPrompt=true.的添加设置此属性时,服务器代码将使用keytab中的信息。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/979910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档