我正在尝试在 java 中生成一个 Kerberos 客户端令牌,以便将它发送到一个 kerberized 服务的标头中。
为此,我为我的用户创建了一个 jaas login conf 和一个 keytab。我想在没有任何用户输入的情况下自动生成令牌。现在我设法创建了一个令牌,但我被提示输入用户密码,这不是我想要的。当我将“doNotPrompt”设置为“true”(在 login.conf 中)时,我得到一个异常“无法从用户获取密码”,即使我指定了一个 keytab 文件。
我在网上找到了很少的代码示例,尽管最终我使用了它们。但我没有找到我正在尝试做的事情的答案。有谁知道如何完成我想要的?
我的 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();
}