Apache2 HTTPD(v2.4.23)后面的Tomcat(v7.0.47):Java升级后连接失败

Posted

技术标签:

【中文标题】Apache2 HTTPD(v2.4.23)后面的Tomcat(v7.0.47):Java升级后连接失败【英文标题】:Tomcat (v7.0.47) behind Apache2 HTTPD (v2.4.23): connection fails after Java upgrade 【发布时间】:2021-11-01 01:52:20 【问题描述】:

我们在 Apache2 HTTPD 代理 (v2.4.23) 后面的 Apache v7.0.47 服务器上运行旧版应用程序。 我正在尝试将服务器上的 Java 版本(由代理和 tomcat 使用)从 v1.8.0_181 升级到 v1.8.0_303。

升级后,Tomcat 不再响应 Apache 传递的请求(应用程序本身启动并运行良好)。

面向网络的 Apache 以及彼此之间的 Apache 和 Tomcat 都被配置为“对话”TLS1.2 已经有一段时间了,所以我不认为禁用 TLSv1.0 和 TLSv1。更高版本的 Java 版本中的 1 是这里问题的原因。并且日志中没有错误消息提供任何线索。唯一的迹象是,Tomcat 在收到请求后似乎关闭并断开连接而没有任何响应。这似乎已经发生在 SSL 层中,因为(Tomcat 的)访问日志中没有条目。

切换回“旧”Java 让事情重新开始,所以防火墙、网络等绝对不是这里的问题。使用较新的 Java 版本时,连接设置再次失败,导致 HTTPD 发出“502 Bad gateway”错误。

任何人知道什么会导致 Tomcat 仅仅基于 Java 版本拒绝 HTTPD 的请求吗?在较新的堆栈中默认启用其他 SSL 验证?我进行了广泛的搜索,但尚未发现任何嫌疑人。

后来补充:试图确定问题我发现使用 Java v1.8.0_231 仍然可以正常工作,使用 v1.8.0_241 及更高版本失败。 现在检查发行说明以找到提示...

任何人对此升级有任何想法或经验吗?

【问题讨论】:

【参考方案1】:

仅作记录 - 以防其他人偶然发现这个问题:

这里的问题是,从 Java v1.8.0_241 开始,Java 安全性验证从证书存储读取的证书链是否植根于具有正确 CA 标志的 CA 证书。由于我们使用的是旧版本的 java keytool 生成的旧证书和信任库,因此缺少此标志,因此新 Java 版本拒绝了该证书文件中的所有条目。因此,它中止了 SSL 连接设置,并在没有任何响应或指示的情况下简单地关闭了连接。

有一个 VM 选项 -Djdk.security.allowNonCaAnchor=true 可以添加到 Tomcat 的 JAVA_OPTS 变量(通常在文件 setenv.sh 中)以禁用此验证。添加后,我们的 Tomcat 再次响应 SSL 请求并再次正常工作。

顺便说一句:当尝试分析上述 SSL 问题时,-Djavax.net.debug=all:handshake:verbose 选项被证明是真正的救星!使用此选项可以获得非常详细的日志输出,并且可以详细遵循 SSL 握手和连接设置。一旦我终于得到了第一个有用的错误消息,指向这个 CA 标志问题,与最初搜索这里可能存在的问题相比,搜索解决方案(或者更确切地说是在这种情况下的解决方法)被证明是一个简单的过程。

【讨论】:

以上是关于Apache2 HTTPD(v2.4.23)后面的Tomcat(v7.0.47):Java升级后连接失败的主要内容,如果未能解决你的问题,请参考以下文章

OSX + Apache2 + httpd.conf + hosts + .htaccess = 不工作

linux系统用service httpd restart重启apache2 提示httpd:unrecognized service 该怎么解决

apache2虚拟主机实现一个服务器绑定多个域名

Apache2.4之httpd.conf配置详解

linux下apache2的httpd.conf如何配置?

apache与php的安装 现在最新版本的安装怎么安装啊 装了前面那个装后面那个都不行。求详细教程!!!