如果这个问题已经被解决了,我很抱歉。我发现了很多相关的问题,比如:
https://superuser.com/questions/1649382/upgrade-from-openjdk-11-0-7-to-11-0-11-causes-sslhandshakeexception-no-appropri
但是没有一个回答我的问题,它们似乎都与我的Java 11版本中应该修复的问题有关,或者与我没有使用的TLSv1.0/v1.1有关。
我没有将这个问题标记为与Grails相关,因为我不认为Grails框架是这里的问题所在。
无论如何,我继承了一个旧的Grails 2应用程序,目前正在将其升级到Grails 5。我目前在测试服务器和Tomcat 9上同时部署了这两个应用程序。Grails 2版本是使用Oracle JDK www.example.com构建1.8.0.221,Grails 5应用程序是使用Termurin JDK 11.0.13构建的。
为了让新的Grails 5应用程序在Tomcat 9上运行,我还需要通过一个文件将Tomcat 9的JAVA_HOME设置为Java 11:tomcat/bin/setenv.sh
这些应用程序通过SendGrid向用户发送电子邮件通知。
但是,当我强制Tomcat使用Java 11时,通过旧Grails 2应用程序中的SendGrid发送的电子邮件会失败,原因是:SSLHandshakeException:
No appropriate protocol (protocol is disabled or cipher suite is inappropriate)
我尝试使用Grails 2应用程序强制执行的TLS版本和密码套件,因为它们在启动时设置如下:
System.setProperty("https.protocols","TLSv1.2")
System.properties['jdk.tls.client.protocols'] = 'TLSv1.2'
System.properties['https.cipherSuites'] = 'TLS_DHE_RSA_WITH_AES_256_GCM_SHA384'
但是当Tomcat被设置为使用JDK 11时,我没有运气将这些电子邮件发送到在旧Grails 2应用程序中工作的SendGrid。我不认为TLSv1.2是问题所在,因为它仍然应该得到广泛支持,但是我也无法通过更改密码套件或完全禁用这些指令来克服这个问题。
这个问题似乎仅仅与强制Tomcat 9使用JDK 11有关,我需要使用JDK 11来升级Grails 5。
我需要支持旧的Grails 2应用程序一段时间,直到Grails 5版本可以投入生产,并且我不希望仅仅为了这个SSL问题而使用两个不同的Java版本运行两个单独的Tomcat示例。
这是Java 11和/或Tomcat 9的已知问题吗?如果是,是否有解决方法?这是否可能与我的Java 8 JDK是Oracle发行版,而我的Java 11 JDK是OpenJDK/Temurin这一事实有关?
1条答案
按热度按时间myss37ts1#
根据***dave_thompson_085***对我最初问题的回答,我们有一个解决方案(某种程度上)。
Grails Mail插件构建在Spring Mail之上,而Spring Mail又构建在JavaMail之上,不幸的是,Grails 2可用的最新插件版本是1.0.7,这是一个非常旧的版本,仍然使用TLS1.0/1.1上的JavaMail版本。
我的Grails 5应用程序中使用的插件3.0版本没有出现同样的问题,并且它不依赖于这些旧的协议版本,这些协议版本已经从我用于Tomcat的JDK 11中删除。
我将仔细检查以确认这一点,但只要我需要保留旧的应用程序一段时间,我就需要在我为Tomcat使用的Java 11发行版中临时重新启用旧的TLS协议,直到Grails 5应用程序准备好投入生产。
我在Java 11分发文件中找到了一些有关如何执行此操作的说明,请访问:
https://www.petefreitag.com/item/916.cfm
另一个解决方案是使用11.0.11之前的JDK 11版本,但最终实现与上述相同的效果,重新启用不安全的TLS协议。
最后一个解决方案是为我的旧Grails 2/Java 8应用程序找到一个替代的邮件客户端解决方案,考虑到它在生产中的时间不会太长,这似乎是浪费时间。