我有一个部署在Glassfish上的应用程序,并侦听端口8181以获取HTTPS流量(当前)。问题是,部署后,客户很少为服务器创建有效的证书。这意味着HTTPS无法通过证书检查。
我们的应用程序中有一些类型的内容,我们想通过HTTP获取,因为它是静态的,并且提取未加密的事实不是问题。
我们遇到的问题是只有端口8181可供用户使用(防火墙等,不能更改)。
因此,我们需要一种方法让Glassfish监听端口8181上的传入连接,并确定正在尝试的协议(https://myserver:8181
或http://myserver:8181
)。
我见过Tomcat的解决方案: https://serverfault.com/questions/47876/handling-http-and-https-requests-using-a-single-port-with-nginx#comment-37501
有关如何使用Glassfish执行此操作的任何想法?我们可以在那里实现一个钩子并适当地交给处理程序(HTTP或HTTPS)吗?
答案 0 :(得分:2)
您尝试执行的操作称为“端口统一”,should be supported by Glassfish称为implemented in Grizzly。
答案 1 :(得分:0)
我看过那边的所有answers,他们说的差不多: 由于HTTP和HTTPS之间的差异,这是不可能的。甚至浏览器也使用不同的默认端口来处理HTTP / HTTPS。
为什么会发生这种情况:HTTP基本上是文本协议,浏览器只是通过TCP-IP发送HTTP(文本)标头。 HTTPS不仅仅是SSL上的SSL。首先,浏览器执行“握手”,然后从服务器证书接收,从服务器到浏览器的所有信息(反之亦然)都使用握手期间协商的对称密钥进行编码。
由于在非对称加密中使用的2个密钥(公共和私有),没有人(除了知道私钥的人)无法嗅探或更改信息。
实验:尝试执行以下操作: 将 https 更改为 http ,并在最后明确添加“443”(类似 http://google.com:443 ) 您有“连接已重置”或建议存储二进制文件(例如证书)。
注意:通常将服务器设置为拒绝此类请求。
因此,即使您使用相同的连接器来处理HTTP和HHTPS连接,您也应该使用不同的连接处理程序(我们在实现基于Netty的高负载服务器时遇到此问题)。
在同一端口上使用HTTP和HTTPS的唯一可能性是使用“魔术识别器”,它将检查纯文本或二进制握手。如果我们将该识别器放在容器一侧(Glassfish协议处理程序),它将具有相当大的性能开销(检查每个请求是否为SSL!)。如果我们把它放在代理服务器端(例如nginx或其他非阻塞服务器,如Netty),性能不会受到太大影响,但无论如何这并不能保证100%的成功。
注意:代理服务器只识别,然后将请求转发到2个不同的端口!
作为结论:总的来说,这是可能的,但从我的观点来看,所需的工作并不值得。
编辑:正如@Bruno回答的那样,现有魔术识别器,但Glassfish并不支持正式。