Реализация аутентификации Kerberos с помощью Javamail - PullRequest
1 голос
/ 21 февраля 2012

Существует более старая тема , которая, кажется, единственная релевантная дискуссия, которую мне удалось найти.

Я пытаюсь реализовать Kerberos с помощью Javamail (через IMAP), и я полностью запутался в том, что именно нужно делать с 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, startTLS для TLS / SSL и sasl для kerberos. Но, может быть, что-то перекрывает другое?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Пока не 100%, но я сделал несколько открытий. ВХОД происходил с протоколом, в NamedURL был "imap". Я изменил его на "imaps".

Однако похоже, что javamail берет протокол, а хост использует их для создания принципала. протокол / хост @ область? поэтому я обращался к основным файлам imaps / host @ REALM, которые не существовали, поэтому произошел сбой при ошибке несоответствия цен.

Итак, мы добавили этот новый принципал на серверы и преодолели это.

Но аутентификация все еще не проходит. В журнале Kerberos я был одобрен и отправил билет для доступа к почте. Но я не вижу его в своем кэше билетов (используя klist) только первый билет для доступа к Kerberos (я получил от использования kinit).

0 голосов
/ 22 февраля 2012

Кажется, я говорю это в каждом ответе. Я не знаю, как вывести слово ....

Вы почти наверняка захотите изменить Session.getDefaultInstance() на Session.getInstance(), хотя это, вероятно, не является источником ваших проблем.

В любом случае, что показывает трассировка протокола при запуске вашей программы? (emailSession.setDebug(true);)

Я недостаточно знаю о Kerberos, и особенно о том, как Kerberos работает как механизм SASL, но вам не придется указывать какой-то пароль? Или он может получить соответствующий билет Kerberos, не попросив вас доказать, кто вы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...