Заставить wildfly слушать порт 443, а не 8443

Поэтому я добавил SSL сертификат к моему wildfly 9 и это работает, но я хочу настроить свой standalone.xml слушать https на port 443 не на port 8443 в качестве конфигурации по умолчанию, поэтому, когда я обновляю значение ${jboss.https.port:8443} to ${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>

1 ответ

Пожалуйста, предоставьте более точную информацию о вашей среде и ошибках.

У меня были такие же потребности, как у вас. Пользователи получают доступ к нашей системе через сеть, где единственные доступные запросы находятся на порту 80 или 443. Затем, когда клиент вызывает систему на порт 80, wildfly перенаправляет на порт 8443, и пользователь не может подключиться к системе. Решением было сделать перенаправление wildfly на порт 443 вместо 8443. Следуйте инструкциям для всех, кто ищет помощь в этом вопросе:

  1. В случае операционной системы на основе Linux порты до 1024 доступны для привязки только с привилегиями root.
  2. Не стоит запускать wildfly или любой другой веб-сервер / сервер приложений с привилегиями root на производственно-ориентированном сервере.
  3. В других руках, попробуйте запустить wildfly с "обычным" пользователем, напрямую связывающимся с портом 443 или 80, генерирующим отказано как ошибки.

Решение описанной выше проблемы состояло в том, чтобы привязать wildfly к портам 8080/8443 (без полномочий root) и попросить операционную систему перенаправить трафик с порта 80 на порт 8080 и с порта 443 на порт 8443. После этого настройте wildfly для перенаправления http запросы на запросы https через порт 443 вместо 8443.

Итак, предположим, что wildfly работает с http на порте 8080 и https на порте 8443 в ОС на базе Linux в качестве службы:

1) Остановить дикую бабочку sudo service wildfly stop

2) Добавьте команды iptables в сценарий запуска /etc/init.d/wildfly, например:

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" из man-страниц iptables:

физ:

К этой таблице обращаются, когда встречается пакет, который создает новое соединение.

Итак, если вы запросили https://localhost/ до создания правила, соединение уже создано, поэтому таблица nat не применяется. Попробуйте с нового устройства.

куда $launched переменная bash для представления состояния wildfly

2) В standalone.xml создайте дополнительную запись привязки к сокету:

<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-слушатель для перенаправления на https-external вместо https:

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

Где изменение - redirect-socket = " https-external "

4) Перезапуск wildfly: запуск sudo службы wildfly

После запуска 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.

Obs: Хорошая идея сделать резервные копии вашего скрипта /etc/init.d/wildfly и конфигурации файла standalone.xml, прежде чем вносить в них изменения.

Другие вопросы по тегам