Java HTTPS重定向通过隧道丢失

Java HTTPS重定向通过隧道丢失,java,ssl,nginx,jakarta-ee,Java,Ssl,Nginx,Jakarta Ee,我在对我们的系统进行集成测试时遇到了一个问题,即通过https使用JSF应用程序时,由于转换为http,从POST后的重定向返回时总是返回400(禁止)。只有通过jumphost通过隧道连接完成请求时,才会发生这种情况 下面是设置: 服务器有一个运行着JSF应用程序的WildFly和一个关心来自443的传入https请求并将它们传输到WildFly端口的nginx 服务器位于一个封闭网络中,可通过jumphost访问该网络,也可从我的机器访问该网络 SSH连接在我的机器上的本地端口和服务器上的

我在对我们的系统进行集成测试时遇到了一个问题,即通过https使用JSF应用程序时,由于转换为http,从POST后的重定向返回时总是返回400(禁止)。只有通过jumphost通过隧道连接完成请求时,才会发生这种情况

下面是设置:

  • 服务器有一个运行着JSF应用程序的WildFly和一个关心来自443的传入https请求并将它们传输到WildFly端口的nginx
  • 服务器位于一个封闭网络中,可通过jumphost访问该网络,也可从我的机器访问该网络
  • SSH连接在我的机器上的本地端口和服务器上的443端口之间建立隧道
  • 浏览器请求https://localhost:myport
现在,每当我发布一些东西,例如登录,重定向的答案就会返回http方案,从而给我一个400。如果我在浏览器中手动添加https,请求将得到正确响应

同一URL的卷曲给了我以下信息:

curl -i -k https://localhost:8426
HTTP/1.1 302 Found
Server: nginx
Date: Fri, 23 Oct 2020 15:03:52 GMT
Content-Length: 0
Connection: keep-alive
Set-Cookie: INCENTCONTROL_JSESSIONID=[....]; path=/
Location: http://localhost:8426/login.xhtml
如果我直接从服务器网络中的机器上执行同样的操作,一切都很好


隧道与这个问题有什么关系?有人知道如何克服它吗?

我可以想象,这个问题是因为服务器应用程序期望的域不是您使用的域,因为您正在进行隧道。您使用的域会显示在TLS握手中,也会显示为主机头,因此会对服务器行为产生影响。这也可能是您需要使用
-k
的原因,即忽略由此导致的证书问题。相反,您应该让curl使用真实名称,但使用隧道IP地址。请参阅curl的
--resolve
参数以了解这一点。@SteffenUllrich谢谢您的提示,听起来很合理。