2012-02-21 101 views
1

有一個older thread似乎是我所能找到的唯一相關討論。使用Javamail實現Kerberos驗證

我試圖通過Javamail(通過IMAP)實現Kerberos,我已經弄清楚了究竟要用mail.imap.sasl.mechanisms完成什麼工作。假設我給出了「GSS-API」的值,但是失去了從哪裏去的地方。我注意到Javamail有一個IMAPSaslAuthernticator類。在我看來,這是需要的,但我可以在哪裏或如何使用它,找到寶貴的小文檔。

任何想法?

注:我想發佈更多的代碼爲我的問題,但根據網站的指示,完整的職位只是答案。所以,我編輯了我最初發布的代碼問題。

下面是真正的肉。現在,一旦我通過這一點,我從服務器獲得消息[],並將大小打印到控制檯。

SSL/TLS安全性是必需的,所以它在下面啓用。在這個例子中,證書由Java中的可信密鑰庫管理。

private Folder folder; 
private Session session; 
private Store store; 

public boolean connectToKerberosMail() { 
    if (folder != null && folder.isOpen()) { 
     return true; 
    } 

    Properties properties = new Properties(); 
    properties.setProperty("mail.debug", "true"); 

    properties.put("mail.imaps.connectiontimeout",600000); 
    properties.put("mail.imaps.timeout",601000); 
    properties.put("mail.imaps.fetchsize", 65000); 
    properties.put("mail.imaps.starttls.enable", "true"); 
    properties.put("mail.imaps.starttls.required", "false"); 

    properties.put("mail.imaps.sasl.enable","true"); 
    properties.put("mail.imaps.sasl.mechanisms","GSSAPI"); 
    properties.put("mail.imaps.sasl.authorizationid",<user>); 
    properties.put("mail.imaps.sasl.realm",<realm>); 

    System.setProperty("sun.security.krb5.debug", "true"); 
    System.setProperty("java.security.krb5.realm",<realm>); 
    System.setProperty("java.security.krb5.kdc", <ip-address>); 
    System.setProperty("java.security.auth.login.config", "jaas.conf"); 
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); 

    try { 
     session = Session.getInstance(properties); 
    } catch (Exception e) { 
     session = null; 
     return false; 
    } 

    session.setDebug(true); 

    URLName url = new URLName("imaps", <host>, <port>, "", <user>, <pass>); 
    store = new IMAPSSLStore(session, url); 

    try { 
     store.connect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     store = null; 
     session = null; 
     return false;   
    } 

    return openFolder(); 
} 

我Jaas.conf檔案如下(票據緩存從收購的kinit):

com.sun.security.jgss.initiate { 
    com.sun.security.auth.module.Krb5LoginModule required 
    principal="<principal>" 
    ticketCache="<cache-path>" 
    doNotPrompt="true" 
    useTicketCache="true" 
    debug="true"; 
}; 

com.sun.security.jgss.accept { 
    com.sun.security.auth.module.Krb5LoginModule required 
    principal="<principal>" 
    ticketCache="<cache-path>" 
    doNotPrompt="true" 
    useTicketCache="true" 
    debug="true"; 
};  

我最近張貼在這裏的產量,但發現我的一些屬性,其中指定「IMAP」而不是「imaps」。因此,在posintg輸出將其更改之前,我正在進行更多測試。

在此期間,我有什麼正確的?從我的理解,我必須啓用imap的imap連接,啓動TLS的TLS/SSL,和sasl kerberos。但也許有什麼東西壓倒另一個?

回答

0

看來,我在每一個迴應中都這樣說。我不知道怎麼弄出來......

你幾乎可以肯定要更改Session.getDefaultInstance()Session.getInstance(),雖然這可能不是你的問題的根源。

無論如何,在運行程序時協議跟蹤會顯示什麼內容? (emailSession.setDebug(true);

我不知道有足夠的瞭解Kerberos和特別是如何工作的Kerberos的SASL機制,但不是你將不得不指定某種密碼?或者它能否獲得適當的Kerberos票據而不要求你證明你是誰?

+0

文檔狀態通過選擇GSSAPI機制可以使用Kerberos,並且上述sasl屬性位於IMAP api中,這需要諸如Kerberos等領域所需的東西。 我成功地運行了一個使用明確的用戶名和密碼直接連接到郵件服務器(IMAP)的javamail客戶端。我還成功地重定向連接到Kerberos服務器,以請求[有用的博客]票(http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html)。 所以所有的peices似乎都存在,但我不知道如何連接它們。 – amirsk 2012-02-22 06:51:00

+0

同樣,協議跟蹤顯示了什麼? – 2012-02-22 20:34:04

+0

找出Javamail和Kerberos的解決方案!我計劃在這裏爲每個搜索代碼示例的人發佈信息。但是在我的解決方案完成之前,我有最後一個問題。我必須通過SSL與Kerberos一起工作。所以我使用IMAPSSLStore。但是URLName需要用戶名和密碼。當我提供它時,Javamail從Kerberos獲取票據並使用它來聯繫IMAP服務器。 問題依然存在,我需要單點登錄,用戶永遠不必提供用戶/密碼。但IMAPSSLStore需要它們並引發異常。 如何用javamail實現單點登錄? – amirsk 2012-02-26 12:05:24

0

雖然不是100%的方式,但我做了一些發現。 NamedURL中的協議是「imap」,LOGIN發生了。我將它改爲「imaps」。

但是,它看起來像javamail採取協議和主機使用它們來構造校長。協議/主機@境界?所以我申請了主要的imaps/host @ REALM,它沒有存在,因此在不匹配的pricipals錯誤上失敗。

所以,我們添加了這個新的主體到服務器,並通過了這一點。

但驗證仍然失敗。在Kerberos日誌中,我獲得批准併發送了一張用於訪問郵件的票據。但是我沒有在我的票據緩存(使用klist)中看到它只有訪問kerberos的第一張票(我使用kinit獲得)。

+0

這部分關於服務主體(imap vs imaps)是現貨。然而,對於「主機」部分,它也是非標準的:它不使用反向DNS作爲主機,而是使用URI中給出的主機。另外,我不相信java將服務票證保存在票據緩存中,它只會讀取它。 – dmansfield 2013-11-20 22:34:24

+0

你有沒有解決這個問題? – Luxspes 2014-05-22 05:53:14