javax.mail-强制IMAP使用TLS1.2+;-&引用;收到致命警报:协议“U版本”;

javax.mail-强制IMAP使用TLS1.2+;-&引用;收到致命警报:协议“U版本”;,java,ssl,jakarta-mail,imap,sslcontext,Java,Ssl,Jakarta Mail,Imap,Sslcontext,我的应用程序无法通过IMAP阅读邮件 应用程序读取多个imap帐户。应用程序可以连接到除需要使用TLS1.2或TLS1.3的服务器之外的所有服务器 我有以下代码: System.out.println("SSLContext getProtocols(): " + String.join(" ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols())); Properties props = new Proper

我的应用程序无法通过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
对于需要TLS1.2+的IMAP服务器,我看到以下输出:

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连接


谢谢。

您可以从JavaMail属性中删除
jdk.tls.client.protocols
属性,因为JavaMail肯定不会解释该属性。在命令行中将其设置为系统属性是可以的,因为JDK将对其进行解释

我没有看到任何关于
deployment.security.*
属性的文档,但我看到的内容表明,它们仅在您使用Java插件或Java WebStart时才相关,而您不是。所以您可能不需要设置这些属性

您收到的错误消息表明您的应用程序正在使用Spring,尽管我在您发布的JavaMail代码中没有看到它。也许Spring以某种方式介入套接字设置代码并控制安全配置


您可以尝试独立的JavaMail示例程序,以证明您可以使用JDK版本建立连接,而无需特殊的安全配置。如果失败,问题就出在JDK安全配置中。

我找到了解决方案:将Spring Boot从2.1.1.RELEASE升级到2.2.4.RELEASE