如何在没有用户输入的情况下生成kerberos令牌

时间:2016-05-29 09:00:53

标签: java kerberos spnego keytab

我尝试在java中生成Kerberos客户端令牌,以便将其发送到用于kerberized服务的标头中。

为此,我为我的用户创建了一个jaas登录conf和一个keytab。 我想在没有任何用户输入的情况下自动生成令牌。现在我设法创建一个令牌,但我正在 提示输入用户的密码,这不是我想要的。 当我设置' doNotPrompt'真的' (在login.conf中)我收到异常"无法从用户"获取密码, 即使我指定了密钥表文件。

我发现网络中的代码示例非常少,但最终我使用了它们。但我没有找到我想要做的事情的答案。 有谁知道如何实现我的目标?

我的login.conf是:

com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required storeKey="true"
principal="HTTP/MyComp@DOMAIN" useKeyTab="true" 
keytab="c:\Users\me\Desktop\abc.keytab";
}

我的java代码是:

String clientPrincipal = "HTTP/MyComp@DOMAIN";
String serverPrincipal = "HTTP/ServerComp@DOMAIN";
Oid oid = new Oid("1.2.840.113554.1.2.2");

try
{
    GSSManager manager = GSSManager.getInstance();
    GSSName gssUserName = manager.createName(clientPrincipal, GSSName.NT_USER_NAME, oid);
    GSSCredential clientGSSCreds = manager.createCredential(gssUserName.canonicalize(oid),
                        GSSCredential.INDEFINITE_LIFETIME,
                        oid,
                        GSSCredential.INITIATE_ONLY);

    GSSName gssServerName = manager.createName(serverPrincipal, GSSName.NT_USER_NAME);
    GSSContext clientContext = manager.createContext(
                        gssServerName.canonicalize(oid),
                        oid,
                        clientGSSCreds,
                        GSSCredential.INITATE_ONLY);

    clientContext.requestCredDeleg(true);
    byte[] token = clientContext.initSecContext(token, 0, token.length);

}
catch (GSSException e){
    e.printStackTrace();
}

1 个答案:

答案 0 :(得分:0)

keytab文件可以包含不同用户的密钥,因此您需要告诉login.conf您将使用其密钥的主体。此主体名称是任意的:它只需要与您在创建密钥表时提供的名称相匹配(尽管我建议使用用户的实际UPN)。