使用非默认 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/app1
和 webapps/app2
以及一个空的 webapps/ROOT
目录。
每个 Web 上下文都有自己的 SSL 连接器,并分配了两个不同域名的正确密钥库,比方说 www.example1.com
和 www.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 反向代理,并让它根据请求的域名将请求转发到适当的端口。
AWS EC2 Linux 机器上的
Jetty 9.3.8.v20160314
运行 Java 1.8.0_51
在两个不同的上下文中定义了两个虚拟主机 - webapps/app1
和 webapps/app2
以及一个空的 webapps/ROOT
目录。
每个 Web 上下文都有自己的 SSL 连接器,并分配了两个不同域名的正确密钥库,比方说 www.example1.com
和 www.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 反向代理,并让它根据请求的域名将请求转发到适当的端口。