Wildfly

Материал из PayControl Wiki
Версия от 14:53, 25 октября 2019; A.bursakov (обсуждение | вклад) (Включение расширенного логирования)
Перейти к: навигация, поиск

Содержание

Настройка

Из командной строки

Подключение к консоли:

sudo /opt/wildfly/bin/jboss-cli.sh --connect

Выполнение команд в неинтерактивном режиме:

sudo /opt/wildfly/bin/jboss-cli.sh --connect --commands=ls\ deployment

Настройка PayControl

Удаление настроек по умолчанию:

data-source remove --name=ExampleDS
/subsystem=ee/service=default-bindings:remove()
reload
/subsystem=datasources/jdbc-driver=h2:remove
/subsystem=undertow/server=default-server/host=default-host/location=\/:remove()
/subsystem=undertow/configuration=handler:remove()

Добавление драйвера (postgresql) и источников данных:

module add --name=org.postgresql --resources=/opt/paycontrol/postgresql-42.2.5.jar --dependencies=javax.api,javax.transaction.api,javax.servlet.api
/subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgresql",driver-class-name=org.postgresql.Driver)
data-source add --jndi-name=java:jboss/datasources/PayControlDS --name=PayControlDS --connection-url=jdbc:postgresql://localhost:5432/pcs --driver-name=postgres --user-name=pcuser --password=XXXXXXXX
data-source add --jndi-name=java:jboss/datasources/PayControlISDS --name=PayControlISDS --connection-url=jdbc:postgresql://localhost:5432/pcis --driver-name=postgres --user-name=pcuser --password=XXXXXXXX

Установка wsdl-host

/subsystem=webservices:write-attribute\(name=wsdl-host,value=docker.loc\)

Добавление источников данных (разные СУБД)

Datasource Connection URL
IBM DB2 jdbc:db2://SERVER_NAME:PORT/DATABASE_NAME
MariaDB jdbc:mariadb://SERVER_NAME:PORT/DATABASE_NAME
Microsoft SQL Server jdbc:sqlserver://SERVER_NAME:PORT;DatabaseName=DATABASE_NAME
MySQL jdbc:mysql://SERVER_NAME:PORT/DATABASE_NAME
Oracle jdbc:oracle:thin:@SERVER_NAME:PORT:ORACLE_SID
PostgreSQL jdbc:postgresql://SERVER_NAME:PORT/DATABASE_NAME
Sybase jdbc:sybase:Tds:SERVER_NAME:PORT/DATABASE_NAME

Удаление настроек по умолчанию

При конфигурировании Wildfly можно (при переводе системы в промышленную эксплуатацию - рекомендуется) удалить пример источника данных и страницу-приветствие. Для этого в файле standalone.xml необходимо убрать (либо закомментировать) следующие объекты:

                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
             <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>
                    <location name="/" handler="welcome-content"/>
            <handlers>
                <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            </handlers>

Добавление сертификатов корпоративных УЦ

java keytool – с его помощью установить корневой сертификат в keystore. Если есть промежуточные, то их тоже.

java keystore password по умолчанию – “changeit”.

Примеры инструкций:

Как минимум в CN сертификата должен быть адрес, по которому происходит обращение к серверу (DNS или IP). Если этого будет недостаточно, тогда добавить в SAN сертификата.

Включение и конфигурирование HTTPS

Добавление сертификата

Для добавления/обновления сертификата необходимо выполнить следующие действия:

  1. Составить цепочку сертификатов.
    Из файлов сертификатов в формате PEM (Base64) составить цепочку путём соединения в новом файле с расширением crt, например fullchain.crt. Для этого в новый файл с помощью текстового редактора нужно добавить сертификат корневого УЦ, промежуточных, и собственно сертификат сервера.
  2. Создать контейнер формата pkcs12:
    openssl pkcs12 -export -in fullchain.crt -inkey private_key.key -out keycontainer.p12
    
    при экспорте следует задать пароль <password> для приватного ключа.
  3. Создать JKS-контейнер из PKCS12:
    keytool -importkeystore -srckeystore keycontainer.p12 \
            -srcstoretype PKCS12 \
            -destkeystore <container-name>.jks \
            -deststoretype JKS
    
    при импорте указываем <password>, при экспорте указываем пароль к контейнеру.
  4. Скопировать <container-name>.jks например в /opt/wildfly/standalone/configuration/ (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows).
  5. Путь к контейнеру и пароли указать в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows), в объекте keystore:
                <security-realm name="ApplicationRealm">
                    <server-identities>
                        <ssl>
                            <keystore path="ПУТЬ К ФАЙЛУ-КОНТЕЙНЕРУ.jks" relative-to="jboss.server.config.dir" keystore-password="ПАРОЛЬ К КОНТЕЙНЕРУ" alias="server" key-password="ПАРОЛЬ К ПРИВАТНОМУ КЛЮЧУ" generate-self-signed-certificate-host="localhost"/>
                        </ssl>
                    </server-identities>
    
  6. Перезапустить сервис WildFly.
  7. Проверить подключение:
    openssl s_client -connect <server-name>:8443
    
    Verify Result должен быть 0.

Отключение HTTP порта (8080)

В работе
Предупреждение! Приведённый ниже порядок действий применим для приложений, не публикующих WSDL-схему. Для приложений с WSDL потребуется дополнительная донастройка.

Для того, чтобы на сервере PCIS External отключить доступ к REST-интерфейсу по порту 8080 необходимо в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows) (перед этим лучше сделать его резервную копию) в блоке <server name="default-server"> удалить строку

<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>

В блоке <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> удалить строку:

<socket-binding name="http" port="${jboss.http.port:8080}"/>

Изменить параметр <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/> следующим образом (изменить значение connector-ref с default на https):

<http-connector name="http-remoting-connector" connector-ref="https" security-realm="ApplicationRealm"/>

Переключение публикации схемы на HTTPS

Для того, чтобы, располагающаяся в WSDL, ссылка на схему была также корректна, необходимо в <subsystem xmlns="urn:jboss:domain:webservices:2.0"> добавить (заменив значения wsdl-host и, при необходимости, wsdl-port и wsdl-secure-port на необходимые) следующее:

            <wsdl-host>yoursite.com</wsdl-host>
            <wsdl-port>8080</wsdl-port>
            <wsdl-secure-port>8443</wsdl-secure-port>
            <wsdl-uri-scheme>https</wsdl-uri-scheme>

Пример результата:

<subsystem xmlns="urn:jboss:domain:webservices:2.0">
            <wsdl-host>paycontrol.org</wsdl-host>
            <wsdl-port>8080</wsdl-port>
            <wsdl-secure-port>8443</wsdl-secure-port>
            <wsdl-uri-scheme>https</wsdl-uri-scheme>
            <endpoint-config name="Standard-Endpoint-Config"/>
            <endpoint-config name="Recording-Endpoint-Config">
                <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
                    <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
                </pre-handler-chain>
            </endpoint-config>
            <client-config name="Standard-Client-Config"/>
        </subsystem>

Указание определённых стандартов защиты и алгоритмов

Для выбора стандарта защиты HTTPS, только, например, TLS 1.2, нужно в объект https-listener объекта <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавить, enabled-protocols="TLSv1.2".

Для выбора определённых криптографических алгоритмов, необходимо их указать в объекте https-listener объекта <subsystem xmlns="urn:jboss:domain:undertow:X.X">. Например, для запрета режимов работы без использования алгоритмов Диффи-Хеллмана, нужно добавить enabled-cipher-suites="ALL:!kRSA".

Пример:

<subsystem xmlns="urn:jboss:domain:undertow:1.2">
    <server name="default-server">
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" enabled-cipher-suites="ALL:!kRSA" enabled-protocols="TLSv1.2"/>
    </server>
</subsystem>

https://security.stackexchange.com/questions/145855/how-to-enforce-perfect-forward-secrecy-using-jvm-properties

https://www.openssl.org/docs/manmaster/man1/ciphers.html

Включение заголовка HSTS

Для включения заголовка HSTS необходимо

  • в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> в <server name="default-server"> в <host name="default-host" alias="localhost"> добавить параметр <filter-ref name="transport-security"/>.
  • в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавить:
    <filters>
        <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/>
    </filters>
    

Пример:

<subsystem xmlns="urn:jboss:domain:undertow:6.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" enabled-cipher-suites="ALL:!kRSA" enabled-protocols="TLSv1.2"/>
        <host name="default-host" alias="localhost">
            <http-invoker security-realm="ApplicationRealm"/>
            <filter-ref name="transport-security"/> 
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <filters>
        <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/>
    </filters>
</subsystem>

Изменение номера порта

В работе
Предупреждение! ОС Linux не позволяет сервисам работающим не от имени root использовать порты с номерами ниже 1024. Для использования портов ниже 1024 необходимо выполнять трансляцию, например с помощью netfilter (iptables/firewalld).

Для изменения номера порта необходимо в файле /opt/wildfly/standalone/configuration/standalone.xml (Linux) или в C:\wildfly\standalone\configuration\standalone.xml (Windows), в блоке

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">

в нужном (для http, либо https) параметре

<socket-binding name="http" port="${jboss.http.port:8080}"/>
<socket-binding name="https" port="${jboss.https.port:8443}"/>

изменить номер используемого порта.

После изменения номера порта, службу wildfly необходимо перезапустить.

При использовании «сервером» стандартных портов (80 для HTTP или 443 для HTTPS), при установке параметров настроек «клиента» для подключения к «серверу», номер порта устанавливать не рекомендуется. Согласно RFC2616 используется порт по умолчанию. При дополнительном указании в адресе порта по умолчанию бывали случаи возникновения проблем подключения.

Приведённые ниже примеры описаны для протокола HTTP. При использовании HTTPS, необходимо скорректировать название используемого протокола в адресе подключения.

Изменение порта PCS

При изменении порта для подключения к PCS, необходимо:

Для изменения номера порта для обращения к PCS, в настройках PCIS External в файле /opt/wildfly/bin/standalone.conf (Linux) или C:\opt\wildfly\bin\standalone.conf.bat (Windows), в строке

JAVA_OPTS="$JAVA_OPTS -Dpcservice.endpoint=http://localhost:8080/ws/PayControlServiceV3?wsdl -Duser.language=ru -Dpaycontrol.locale=ru"

в параметре -Dpcservice.endpoint=http://<HOSTNAME>:<PORT>/ws/PayControlServiceV3?wsdl установить новое значение <PORT>.

Изменение порта PCIS Internal

Для изменения порта для подключения к PCIS Internal необходимо в БД PCS выполнить следующий запрос:

update pc_system set pc_is_internal_url='http://<HOSTNASME>:<PORT>/wsis/PayControlInteractionService?wsdl' where systemid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';

где

  • <HOSTNASME> - имя хоста PCIS Internal;
  • <PORT> новое значение порта;
  • XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - UUID идентификатор прикладной системы.

Допускается выполнять запрос к БД PCS на обновление адреса PCIS Internal без указания systemid, в случае, если подключена только одна прикладная система, или необходимо обновить адрес PCIS Internal для всех прикладных систем.

После изменения номера порта, службу wildfly необходимо перезапустить.

Изменение порта PCIS External

В работе
Предупреждение! При изменении порта PCIS External мобильное приложение потеряет возможность подключения к серверу PayControl до тех пор, пока пользователю мобильного приложения не будет перевыпущен ключ с новым адресом подключения к серверу.


В работе
Предупреждение! Изменение порта, на котором сервер PCIS External ожидает подключения не всегда ведёт к изменению порта назначения, который используется мобильным приложением для доступа к серверу PayControl. Такая ситуация, например, может возникнуть, если перед сервером PCIS External со стороны сети Интернет установлено оборудование/ПО, выполняющее трансляцию сетевых портов.

При изменении порта PCIS External необходимо в БД PCS выполнить следующий запрос:

update pc_system set pc_is_external_url='http://<HOSTNASME>:<PORT>/PayControl-interaction-rest/' where systemid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';

где

  • <HOSTNASME> - имя хоста PCIS External, используемое мобильными устройствами для доступа к серверу PayControl;
  • <PORT> новое значение порта;
  • XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - UUID идентификатор прикладной системы.

Допускается выполнять запрос к БД PCS на обновление адреса PCIS External без указания systemid, в случае, если подключена только одна прикладная система, или необходимо обновить адрес PCIS External для всех прикладных систем.

После изменения номера порта, службу wildfly необходимо перезапустить.

Журналирование

Доступ к данным журнала

Журнал работы сервера PayControl записываются общий лог функционирования Wildfly.

Файлы журналов за текущий день доступны по следующему пути:

  • Linux:
    /opt/wildfly/standalone/log/server.log
  • Windows:
    C:\wildfly\standalone\log\server.log

Для просмотра журнала за другие дни, нужно добавить к имени файла требуемую дату в формате server.log.YYYY-MM-DD

Включение журналирования SOAP-вызовов

Для включения расширенного логирования необходимо:

  1. Остановить службу wildfly.
  2. Добавить после блока <extensions> ... </extensions> в файл
    • Linux:
      /opt/wildfly/standalone/configuration/standalone.xml
    • Windows:
      C:\wildfly\standalone\configuration\standalone.xml
    следующий блок:
        <system-properties>
            <property name="org.apache.cxf.logging.enabled" value="pretty"/>
        </system-properties>
    
  3. Запустить службу wildfly.

Проблемы и способы их устранения

Очень медленный старт через standalone.sh (каждый этап скрипта запуска - с большими задержками). Система отправляет сигнал на остановку сервиса

Вероятная проблема - неверные настройки DNS сервера.
Решение:Необходимо скорректировать настройки DNS.
Проблема обнаружилась 2018-07-27 при развёртывании у заказчика. A.bursakov (обсуждение) 19:56, 1 августа 2018 (MSK)

Не происходит «биндинг» IP-адреса адаптера

Вероятная проблема - отсутствие PTR-записи на DNS-сервере, или неправильная работа службы DNS.
Решение: Добавить в файл opt/wildfly/bin/standalone.conf (Linux) или C:\opt\wildfly\bin\standalone.conf.bat (Windows), в переменную JAVA_OPTS параметр -Djboss.bind.address=0.0.0.0
Проблема проявилась на тестовом Windows-сервере A.bursakov (обсуждение) 19:56, 1 августа 2018 (MSK)

Частое появление WARNING в логе

Предупреждения в логе вида:

WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-1) Interceptor for {http://ws.safetech.ru/PayControlV3/}PayControlServiceV3 has thrown exception, unwinding now: org.apache.cxf.binding.soap.SoapFault: Error writing to XMLStreamWriter.
Caused by: com.ctc.wstx.exc.WstxIOException: UT010029: Stream is closed
Caused by: java.io.IOException: UT010029: Stream is closed
WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-1) Interceptor for {http://ws.safetech.ru/PayControlV3/}PayControlServiceV3 has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Could not send Message.
Caused by: java.io.IOException: Broken pipe

Могут быть вызваны системой мониторинга, которая для проверки того, что сервер доступен, устанавливает соединение и обрывает его получив лишь только header.

Для отключения предупреждений о непредвиденном закрытии соединения необходимо в файл /opt/wildfly/standalone/configuration/standalone.xml в блок

<profile>
    <subsystem xmlns="urn:jboss:domain:logging:X.X">
       ... 
    </subsystem>
</profile>

добавить:

<!-- to prevent warnings on unsuspicious connection close -->
<logger category="org.apache.cxf.phase.PhaseInterceptorChain">
      <level name="ERROR"/>
</logger>

INFO: Disabling contextual LOB creation as createClob() method threw error

Иногда смущает появление в журнале события, из-за присутствия в его составе слова "error":

   INFO  [org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl] (ServerService Thread Pool -- 64) HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 

Для отключения этого сообщения необходимо установить hibernate.temp.use_jdbc_metadata_defaults=false в файл persistence.xml, располагающийся внутри модуля сервера следующим образом:

       <properties>
           ...
           <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
           ...
       </properties>