2016-05-29 72 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)。

相關問題