使用非默认 HTTPS 端口而不将其写入 Jetty/Linux 上的 URL

Using non default HTTPS port without writing it in URL on Jetty/Linux

AWS EC2 Linux 机器上的

Jetty 9.3.8.v20160314 运行 Java 1.8.0_51 在两个不同的上下文中定义了两个虚拟主机 - webapps/app1webapps/app2 以及一个空的 webapps/ROOT 目录。

每个 Web 上下文都有自己的 SSL 连接器,并分配了两个不同域名的正确密钥库,比方说 www.example1.comwww.example2.com

问题是每个 SSL 连接器必须使用不同的端口,因此第一个应用程序将使用端口 443,但第二个应用程序使用 444,这不是 HTTPS 调用的默认端口。现在,app2 的客户端将不得不使用 https://www.example2.com:444,这并不漂亮。

是否有一些解决方法可以省略 :444 部分?

也许可以在 WebAppContext.xml 上定义一些东西来将调用转发到端口 444,或者在 DNS 区域文件中?

也许这可以在 Linux 水平上完成,使用 iptables?

webapps/appX.xml-

的内容
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/</Set>
  <Set name="war">
    <SystemProperty name="jetty.home" default="."/>/webapps/appX
  </Set>
  <Set name="virtualHosts">
     <Array type="java.lang.String">
       <Item>www.exampleX.com</Item>
     </Array>
  </Set>

  <!-- by Code Range -->
  <Get name="errorHandler">
    <Call name="addErrorPage">
      <Arg type="int">400</Arg>
      <Arg type="int">599</Arg>
      <Arg type="String">/</Arg>
    </Call>
  </Get>
</Configure>

etc/jetty-ssl.xml-

的内容
<Configure id="Server" class="org.eclipse.jetty.server.Server">
    ... 
  <Call  name="addConnector">
    <Arg>
      <New id="sslConnector2" class="org.eclipse.jetty.server.ServerConnector">
        <Arg name="server"><Ref refid="Server" /></Arg>
        <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
        <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
        <Arg name="factories">
          <Array type="org.eclipse.jetty.server.ConnectionFactory">
          </Array>
        </Arg>

        <Set name="host"><Property name="jetty.ssl.host" deprecated="jetty.host" /></Set>
        <Set name="port">8444</Set>
        <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
        <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
        <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
        <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
      </New>
    </Arg>
  </Call>
   ...
</Configure>

SSL 连接器设置为端口 8444 并由 iptables 从外部端口 444 -

转发
sudo iptables -t nat -I PREROUTING -p tcp --dport 444 -j REDIRECT --to-port 8444

没有省略端口的解决方法。如果您指定一个没有端口的 HTTPS URL,您实际上是在隐式指定端口 443。

我建议考虑在您的 Jetty 应用程序前面放置一个 Nginx 反向代理,并让它根据请求的域名将请求转发到适当的端口。