使WildFly监听443端口而不是8443端口

4

我已经将 SSL 证书添加到我的 wildfly 9 上,并且它正在工作,但我想配置我的 standalone.xml 监听在 443 端口的 https,而不是默认配置中的 8443 端口。因此,当我将值 ${jboss.https.port:8443} 更新为 ${jboss.https.port:443} 时,会生成错误。以下是我在 standalone.xml 中的内容:

<server name="default-server">
            <http-listener name="default" socket-binding="http" redirect-socket="https"/>
            <https-listener name="httpsServer" socket-binding="https" security-realm="ApplicationRealm"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <location name="/images" handler="ImagesDirHandler"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
            </host>
</server>

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
    <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    <socket-binding name="http" port="${jboss.http.port:8080}"/>
    <socket-binding name="https" port="${jboss.https.port:8443}"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
    <outbound-socket-binding name="mail-smtp">
        <remote-destination host="localhost" port="25"/>
    </outbound-socket-binding>
</socket-binding-group>

WildFly应用服务器在允许的超时时间内未启动,请查看文件“/var/log/wildfly/console.log”以查看服务状态。 - majd hwas
/var/log/wildfly/console.log 中有任何内容吗? - James R. Perkins
1个回答

8
请提供更准确的环境和错误细节。
我有类似你的需要。用户通过只能使用80或443端口的网络访问我们的系统。当客户在80端口上调用系统时,wildfly将重定向到8443端口,用户无法连接到系统。解决方案是将wildfly重定向到443端口而不是8443端口。以下是为所有寻求此问题帮助的人提供的一些说明:
  1. 对于基于Linux的操作系统,只有具有root权限的用户才能绑定1024个端口以内的端口。
  2. 在生产环境中,使用root权限运行wildfly或任何其他web/app服务器并不是一个好主意。
  3. 另一方面,尝试使用“普通”用户直接绑定到端口443或80来运行wildfly会生成权限被拒绝等错误。
解决上述问题的方法是将wildfly绑定到8080/8443端口(没有root权限),并要求操作系统将流量从80端口重定向到8080端口,将443端口重定向到8443端口。之后,在端口443上,将wildfly配置为将http请求重定向到https请求,而不是8443。
因此,假设在Linux操作系统中作为服务工作的wildfly正在8080端口上使用http,并在8443端口上使用https:

1) 停止wildfly: sudo service wildfly stop

2) 在启动/ etc / init.d / wildfly脚本中添加iptables命令,例如:

if [ $launched -eq 0 ]; then
        log_warning_msg "$DESC hasn't started within the timeout allowed"
        log_warning_msg "please review file \"$JBOSS_CONSOLE_LOG\" to see the status of the service"
    else 
        iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
        iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443

    fi

PS: 您在表格中添加了一个名为“nat”的规则,来自iptables的man页面:

nat:

当遇到创建新连接的数据包时,会使用此表格进行查询。

因此,如果在创建规则之前已请求https://localhost:443,则连接已经创建,因此不会应用nat表。请尝试使用新设备。

其中$launched是表示wildfly状态的bash变量。

2)在standalone.xml中,创建一个额外的socket-binding条目:

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
    <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    <socket-binding name="http" port="${jboss.http.port:8080}"/>
    <socket-binding name="https" port="${jboss.https.port:8443}"/>
    <socket-binding name="https-external" port="443"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
   ...

</socket-binding-group>

请注意新标签输入<socket-binding name="https-external" port="443"/>

3) 将http-listener更改为重定向到https-external而不是https:

<http-listener name="default" socket-binding="http" redirect-socket="https-external" max-header-size=...

当改变重定向套接字时,使用 redirect-socket="https-external"。

4) 重新启动wildfly:sudo service wildfly start

启动wildfly后,请验证console.log文件以查看任何错误报告。

因此,如果您的web.xml部分确保机密传输:

....
<security-constraint>
    ...
    <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
...

Wildfly会将端口80或8080上的请求直接重定向到端口443而不是8443。

注意:在对/etc/init.d/wildfly脚本和standalone.xml文件进行任何更改之前,最好先备份它们的配置文件。


我有完全相同的需求,按照以上所有要点进行了操作。但是端口443无法工作(显示“无法访问此网站”)。尽管8443像以前一样正常工作。还有其他解决方法吗? - ManishS
验证在Wildfly启动时是否有任何已记录的错误。 - Duloren
似乎让Wildfly/Tomcat/Glassfish在80和443端口上运行对我们来说太聪明和容易了。这就是为什么他们没有这样做的原因。你有98%的人通过更改端口来浏览配置,而不是只有1或2%的人将端口更改为默认值以外的其他内容。Java Web开发的一切都让我想吐。 - user2914191
2
不错的答案。记住nat表的工作原理:从man页面中可以看到,“当遇到创建新连接的数据包时,将查询此表”,因此如果您在防火墙规则之前进行了测试,则不会应用该规则。编辑过;) - Daniele Licitra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接