javax.mail - заставляет IMAP использовать TLS1.2 + - «Получено фатальное предупреждение: protocol_version» - PullRequest
0 голосов
/ 29 января 2020

У меня проблема с приложением для чтения почты через IMAP.

Приложение читает несколько учетных записей imap. Приложение может подключаться ко всем серверам, кроме одного, для которого требуется использовать TLS1.2 или TLS1.3.

У меня есть этот код:

System.out.println("SSLContext getProtocols(): " + String.join(" ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols()));

Properties props = new Properties();
props.put("mail.imap.auth", "true");        
props.put("mail.imap.ssl.enable", "true");          
props.put("mail.imap.starttls.enable", "false");
props.put("jdk.tls.client.protocols", "TLSv1.2 TLSv1.3");
props.put("mail.imap.ssl.protocols", "TLSv1.2 TLSv1.3");

Session session = Session.getDefaultInstance(props);
Store store = session.getStore("imaps");
store.connect(mailConf.getImapServer(), mailConf.getImapServerPort(), mailConf.getImapUser(), mailConf.getImapPass());
Folder inbox = store.getFolder(mailConf.getImapMailFolder());
inbox.open(Folder.READ_ONLY);

и запускать приложение, используя:

java -Djdk.tls.client.protocols="TLSv1.2,TLSv1.3" \
-Ddeployment.security.SSLv2Hello=false \
-Ddeployment.security.SSLv3=false \
-Ddeployment.security.TLSv1=false \
-Ddeployment.security.TLSv1.1=false \
-Ddeployment.security.TLSv1.2=true \
-Ddeployment.security.TLSv1.3=true \
-jar myApp.jar

Для сервера IMAP, который требует TLS1.2 +, я вижу этот вывод:

SSLContext getProtocols(): TLSv1.3 TLSv1.2 TLSv1.1 TLSv1 SSLv3 SSLv2Hello
Jan 29 11:41:19 myhost myapp[22101]: 2020-01-29 11:41:19 ERROR e.v.MyAppApplication$$EnhancerBySpringCGLIB$$8bb5321c:68 - Imap readMail() error: Received fatal alert: protocol_version

Я использую Java 11:

# java --version
openjdk 11.0.4 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Debian-1deb10u1, mixed mode, sharing)

Что я делаю плохо ? Как я могу форсировать TLS1.2 + для подключения к imap?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вы можете удалить свойство jdk.tls.client.protocols из свойств JavaMail, поскольку JavaMail определенно не интерпретирует это свойство. Устанавливать его в командной строке как системное свойство можно, поскольку JDK будет его интерпретировать.

Я не видел никакой документации по свойствам deployment.security.*, но то, что я увидел, показывает, что они имеют отношение только к делу. если вы используете плагин Java или Java WebStart, который у вас нет. Поэтому вам, вероятно, не нужно устанавливать эти свойства.

Полученное сообщение об ошибке указывает на то, что ваше приложение использует Spring, хотя я не вижу его в опубликованном вами коде JavaMail. Возможно, Spring каким-то образом вставляет код настройки сокета и управляет конфигурацией безопасности?

Вы можете попробовать автономную программу JavaMail msgshow. java пример программы, чтобы доказать, что вы можете установить соединение используя эту версию JDK без специальной настройки безопасности. Если это не помогло, проблема в конфигурации безопасности JDK.

0 голосов
/ 30 января 2020

Я нахожу решение: обновить Spring Boot с 2.1.1.RELEASE до 2.2.4.RELEASE .

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