2012-02-21 37 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