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

How to generate a kerberos token without user input

我正在尝试在 java 中生成 Kerberos 客户端令牌,以便在 header 中将其发送到 kerberized 服务。

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

我在网上发现的代码示例很少,但最终还是使用了它们。但是我没有找到我正在尝试做的事情的答案。 有谁知道如何实现我想要的?

我的 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();
}

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