2016-05-29 67 views
0

我试图在java中生成一个Kerberos客户端令牌,以便将它发送到kerberized服务的头文件中。如何在没有用户输入的情况下生成kerberos令牌

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

我在网上发现了很少的代码示例,但最终我使用了它们。但我没有找到我想要做的答案。 有谁知道如何完成我想要的?

我login.conf的是:

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

我的Java代码:

String clientPrincipal = "HTTP/[email protected]"; 
String serverPrincipal = "HTTP/[email protected]"; 
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(); 
} 
+0

'HTTP/MyComp @ DOMAIN'不是用户主体,这是一个服务主体。如果您打算使用密钥表,请尝试使用服务帐户。 –

+0

服务帐户是什么意思? SPN设置为Active Directory中的专用帐户,仅用于上述目的。 –

+0

嗨;如果Glenn Lane回答您的问题,请将其标记为会将其验证给社区中的其他人;否则,请告诉我们,如果有的话。 –

回答

0

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

相关问题