我们目前遇到了一些尚未使用过的网络设置问题,我希望获得更多关于如何解决此问题的意见。
我们的一个客户的网络使用 4杰博斯不同服务器上的实例都运行着我们软件的同一版本。它们共享一个公用数据库并按需要运行。软件正在运行,可以使用. 我们不复制会话 - 每个 JBoss 都管理自己的会话池。
4 个 JBoss 实例分为 2 个不同的段每个段使用 2 个不同的 Apache Web 服务器进行路由,mod_jk用于简单的负载平衡。使用的连接器是急性日照JBoss 和 Apache 服务器之间。
两个 Apache Web 服务器都连接到硬件负载均衡器/路由器(我们的客户目前还不是很清楚)内部的要求 (内部网)至一和外部的要求 (互联网) 到另一台 Web 服务器。因此,我们有一个部分用于内部用户,另一个部分用于外部用户。
客户端使用SSL加密HTTPS通过浏览器进行连接——这是一个网络应用程序。SSL 加密由硬件负载均衡器终止. 硬件负载平衡器与 2 个 Web 服务器之间的通道是 HTTP (没有 SSL不再)。
问题:
最后,JBoss 不知道任何 SSL / HTTPs 通信,因此会呈现一些302 重定向充满http://地址,而不是https://。因此,在 JBoss 发生 302 重定向的情况下,另一端的客户端浏览器将从 https://(最初用于连接到 Web 应用程序)切换到 http://。
我们的解决方案:
我们提供了两种解决方案。一种是在最后一端(硬件负载平衡器)上制定简单的重写规则,将所有 http:// 流量重写为 https://。这种方法可行,并保持客户端连接,但被我们的客户拒绝,因为它不寻常,并且无法解决最初的问题。
另一个解决方案是将 SSL 加密扩展到 Web 服务器,这样就能够通过 AJP 将安全标志信号 SSL 通信转发给 JBoss,JBoss 会接收并正确重定向。由于内部安全问题和指导方针,该解决方案被拒绝。
还有什么?
所以我们现在陷入困境,而且锋面越来越硬。除了我们的 2 个解决方案,还有其他替代方案吗?
答案1
另一个选择应该是使用 Apache 中的 mod_headers 来修改 Location 响应标头:
Header edit Location ^http:(.*)$ https:$1
答案2
假设他们需要同时处理 http 和 https 流量,您还可以尝试以下建议之一:-
1)他们可以向来自负载均衡器的通过 https 发送的请求添加一个特定的标头,以便 jboss 实例知道它最初是一个 https 请求。
2)您可以建议将 https 请求发送到 apache 中的不同端口(例如 8080 或甚至 443,但未加密),以便 apache 知道它们来自 https。
答案3
我们遇到了同样的问题。解决方案是在 JBoss/Tomcat 中的 AJP 连接器上设置“scheme”和“secure”属性。将 scheme 设置为 https 并将 secure 设置为 true,以便 Web 容器知道前端使用的是哪种协议。如果您同时使用 http 和 https,请为 https 设置第二个连接器并使用 Apache vhost 和不同的 ajp 设置进行连接。也许您还必须设置 proxyName 属性。