Справочное руководство PC

Справочное руководство включает в себя сведения о возможных допустимых параметрах конфигурации PC и сопуствующих компонентов.

Параметры кофигурации сервера PC

Установка параметров

Настройки PC Server устанавливаются путём добавления/изменения записей в БД модуля, в таблице pc_sys_property. Запись состоит из setting_name и setting_value. Параметры и значения для каждого сервреа перечислены для каждого сервера в соответствующих разделах ниже.

Примеры запросов для установки параметров

PostgreSQL

Добавление значения с помощью SQL-запроса (После выполнения запроса требуется перезапуск службы):

insert into pc_sys_property values (nextval('pc_setting_seq'), 'DEBUG_INFO', '1');

Oracle

insert into pc_sys_property values (PC_SETTING_SEQ.NEXTVAL, 'DEBUG_INFO', '1');

MS SQL

insert into pc_sys_property values (NEXT VALUE FOR PC_SETTING_SEQ, 'DEBUG_INFO', '1');

Пример запроса для изменения параметров

Изменение установленного ранее значения с помощью SQL-запроса (независимо от используемой СУБД):

update pc_sys_property set setting_value = '1' where setting_name='DEBUG_INFO';

Параметры конфигурации PC Server

setting_name По умолчанию Описание
REPORT_TEMPLATE Путь к шаблону отчёта.
Значение используется, если не задано значение в pc_system_params (с 3.6) или pc_system (до 3.6).
KILT 365 Время жизни ключевой информации пользователя (в днях). Сокращение от "KEY_INFO_LIFE_TIME".
Значение используется, если не задано значение в pc_system_params (с 3.6) или pc_system (до 3.6).
BILL_PERIOD 365 Период биллинга (в днях) для постоплатной системы расчётов.
Значение используется, если не задано значение в pc_system_params (с 3.6) или pc_system (до 3.6).
DEBUG_INFO 0 Выводить отладочную информацию (0 – не выводить, 1 - выводить).
CRYPTO_PROVIDER BC Криптопровайдер. Устаревший параметр. Значение только "BC" (сокращение от Bouncy Castle)
T_AUTH_CODE 180 Интервал дискретизации для кода аутентификации (auth_code) (в секундах).
T_CONFIRM_CODE 180 Интервал дискретизации для кода подтверждения (в секундах).
KEY_QR_SIZE 300 Размер QR-кода ключа (в пикселях).
TRANSACTION_QR_SIZE 300 Размер QR-кода транзакции (в пикселях).
CLEAN_TRANSACTION 1 Очищать данные транзакции после подтверждения.
DEFAULT_TRANSACTION_TTL 0 Время жизни транзакций по умолчанию в секундах. 0 – без ограничений.
COLLECT_EVENTS 0
c версии 3.6.367:
1
Включает сбор информации о событиях для сервера.
COLLECT_DEVICE_INFORMATION 0
c версии 3.6.367:
1
Включает сбор информации об устройстве для сервера.
CHECK_HTTP_AUTH_HEADER 1 Включает проверку аутентификации HTTP запросов от МП по значению, передаваемому в HTTP заголовке.
IOS_PUSH_PAYLOAD_TEMPLATE Шаблон push-уведомлений для iOS. Используются только при отправке через PCInform.
ANDROID_PUSH_PAYLOAD_TEMPLATE Шаблон push-уведомлений для Android. Используются только при отправке через PCInform.
c версии 3.6.355:
KEYFLAG_WITH_FINGERPRINT 0 Установка параметра ключа "Обязательное использование Отпечатка устройства" по умолчанию.
Допустимые значения '0' или '1'.
KEYFLAG_COLLECT_EVENTS 0 Установка параметра ключа "Собирать события" по умолчанию.
Допустимые значения '0' или '1'.
KEYFLAG_COLLECT_DEVICEINFO 0 Установка параметра ключа "Собирать информацию об устройстве" по умолчанию. Требует включения сбора событий.
Допустимые значения '0' или '1'.
KEYFLAG_COLLECT_SIMINFO 0 Установка параметра ключа "Собирать информацию о телефоне (SIM-карте)" по умолчанию. Требует включения сбора информации об устройстве. В ОС Android будет выведен запрос на доступ к Телефону (либо потребуется предоставление этих прав при встраивании PC SDK в своё приложение).
Допустимые значения '0' или '1'.
KEYFLAG_COLLECT_LOCATION 0 Установка параметра ключа "Собирать информацию о местоположении (геолокации) устройства" по умолчанию. Требует включения сбора информации об устройстве. Будет выведен запрос на доступ к Местоположению устройства (либо потребуется предоставление этих прав при встраивании PC SDK в своё приложение).
Допустимые значения '0' или '1'.
KEYFLAG_PASS_POLICY 0 Установка параметра ключа "Требований к сложности пароля (пин-кода) для сохранения ключа на устройстве" по умолчанию.
Доступны следующие варианты:
— «0» – минимум 6 символов, пароль не обязателен (доступна кнопка "Без пароля");
— «1» – минимум 6 символов, пароль обязателен;
— «2» – минимум 8 символов (обязательно использование A-Z и a-z) пароль обязателен;
— «3» – минимум 8 символов (обязательно использование A-Z, a-z и 0-9) пароль обязателен.
KEYFLAG_DENY_STORE_WITH_OS_PROTECTION 0 Установка параметра ключа "Запрет сохранения ключа на мобильном устройства, используя системный способ защиты, такой как Apple TouchID/FaceID или Google Imprint" по умолчанию.
Допустимые значения '0' или '1'.
KEYFLAG_DENY_RENEW_PUBKEY 0 Установка параметра ключа "Запрет перерегистрации открытого ключа на сервере" по умолчанию. Является особо рекомендуемым параметром, при подписании акта признания открытого ключа с владельцем ключа ЭП.
Допустимые значения '0' или '1'.
KEYFLAG_SCORING_ENABLED
c версии 5.0
0 Установка параметра ключа разрешающего "скоринг" устройства.
KEYFLAG_AUTOSIGN_ENABLED
c версии 5.0
0 Установка параметра ключа разрешающего автоподтверждение транзакций на основании результатов скоринга.
KEYFLAG_REMOTE_UPDATE_ENABLED
c версии 5.2
1 Установка параметра ключа разрешающего перевыпуск ключа по запросу мобильного устройства.
KEYFLAG_NFC_POLICY
c версии 5.3
0 Установка параметра ключа разрешающего использование NFC-токена для хранения ключа ЭП и генерации ЭП с использованием хранящегося на карте ключа ЭП.
Доступны следующие варианты:
— «0» – Запрещено;
— «1» – Разрешено;
— «2» – Обязательно.
c версии 3.6.368:
NETWORK_TIMEOUT 1000 Количество миллисекунд, которое poster ожидает при установке соединения (при отправке коллбэка, событий, скоринге).
c версии 3.8, но не выше версии 5.0:
APP_ID_FOR_PUSHER {"Android":"ru.safe-tech.PayControl.v3","iOS":"ru.safe-tech.PayControl.v3"} Идентификатор приложения "по умолчанию" (app/bundle id) для отправки на него Push-уведомлений (актуально для приложений на базе PCSDKv1/PCSDKv2)
c версии 5.0:
QR_LOGO_LOCATION c версии 5.2
/opt/pc/qr_logo.png
Путь к файлу логотипа, располагающемуся на QR коде. Если не задан - ничего не выводится. Допустимо использование png/jpg. Рекомендуемый максимальный размер - не более 10% от площади QR-кода. Однако, чем ближе размер логотипа к этой цифре, тем чаще будет отображаться QR без него, т.к. будет срабатывать механизм защиты от ошибок.
QR_COLOR #066AB2 Цвет QR-кода. Применяется только если задан путь к файлу логотипа, располагающемуся на QR-коде.
CLEAN_LOGIN_TRANSACTION 1 Включение удаления данных (ext_pulp) использующихся для механизма входа по QR.
c версии 5.1:
LICENSE_FILE_LOCATION — C:\wildfly\
— /opt/wildfly/
— C:\pc\
— /opt/pc/
Место поиска лицензионных файлов.
При указании пути поиска файла лицензии для OC Windows, необходимо экранировать имеющиеся в пути слеши, например:
C:\\custom_path\\
c версии 5.1.140:
SET_APP_ID_FOR_TRANSACTION_CALLBACK 0 Передавать app_id в коллбэке о подтверждении транзакции (0 — не передавать, 1 — передавать)
c версии 5.2:
CHECK_HTTP_AUTH_HEADER_TIME_INTERVAL 1 Проверка значения времени при HTTP-авторизации (0 — не проверять, 1 — проверять)
EXT_AUTH_FAIL_LIMIT 5 Количество неуспешных попыток использовать дополнительный метод аутентификации, после чего этот доп. метод будет отключён
PKI_SETTINGS_PATH /opt/pc/pki/pki-settings.properties Путь к файлу настроек PKI-коннектора
SERVER_SIGNER_PERS_URL http://localhost:8080/pc-server-signer-api/personalize_async Адрес для персонализации пользователя с серверной подписью
PDF_SIGNATURE_SETTINGS {"position": { "x": 0, "y": 0, "width": 220, "height": 65}, "frame_color": "#004D99", "pdf_permissions": 1}

c версии 5.3:
{"position": { "x": 0, "y": 0, "width": 220, "height": 65}, "frame_color": "#004D99", "pdf_permissions": 1, "visualize_signature": true, "image_uri":"/opt/pc/logo.svg"}
Параметры визуализации PDF-подписи

Параметры конфигурации PC Pusher

Описание возможностей и способа конфигурирования модуля приведено по ссылке.

Включение и конфигурирование 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\ (для Windows).

  5. Имя файла-контейнера (относительный путь от директории configuration) и пароли указать в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows), в объекте keystore (если АЛИАС не был задан, по умолчанию устанавливается значение "1"):

            <security-realm name="ApplicationRealm">
                <server-identities>
                    <ssl>
                        <keystore path="ИМЯ ФАЙЛА-КОНТЕЙНЕРА.jks" relative-to="jboss.server.config.dir" keystore-password="ПАРОЛЬ К КОНТЕЙНЕРУ" alias="АЛИАС" 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)

Для того, чтобы на сервере PC 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"/>

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

Для валидации подключения к хостам, на которых используется сертификат, выпущенный на корпоративном УЦ, необходимо добавить все сертификаты из цепочки для валидации конечного хоста в хранилище доверенных в Java. Для этого необходимо использовать утилиту Java keytool.

sudo keytool -import -alias testCert -keystore $JAVA_HOME/jre/lib/security/cacerts -file example.cer

где alias — alias for the certificate so have a meaningful name file — exported .cer certificate from the browser Пароль по умолчанию – changeit.

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

Параметры ключа

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

Отпечаток устройства

withFingerPrint – указывает, осуществлять ли привязку устройства к Пользователю PC. В случае наличия в запросе на создание пользователя параметра «флаг привязки пользователя к устройству» со значением «true» при проверке кода подтверждения будет использован отпечаток устройства пользователя. Отпечаток устройства вносится в информацию о пользователе путем вызова метода «Сохранение отпечатка устройства».

Флаг не может быть использован одновременно с флагом указывающим, на тип пользователя "Серверная подпись".

Сбор событий

collectEvent – флаг, указывающий необходимость передачи мобильным приложением информации о событиях и сохранения её сервером в базе данных PC.

Информация об устройстве

collectDeviceInfo – флаг, указывающий необходимость сбора информации об устройстве в составе информации о событии. Учитывается только в случае, если установлен флаг collectEvent.

Информация о сим-карте

collectDeviceSIMInfo – флаг, указывающий необходимость сбора информации о телефоне (SIM-карте). При включении – мобильное устройство передаёт информацию, относящуюся к телефону и SIM-карте в составе информации об устройстве. Учитывается только если установлен флаг collectDeviceInfo. На Android-устройстве необходимо дополнительное разрешение приложению на доступ к информации о телефоне.

Информация о местоположении устройства

collectDeviceLocation – флаг, указывающий необходимость сбора информации о местоположении устройства. При включении – мобильное устройство передаёт координаты местоположения устройства в составе информации об устройстве. Учитывается только если установлен флаг collectDeviceInfo. На мобильном устройстве необходимо дополнительное разрешение на доступ к геолокации.

Запрет перерегистрации открытого ключа

denyRenewPublicKey – флаг, запрещающий перерегистарцию открытого ключа сервере, если открытый ключ уже был зарегистрирован ранее.

Параметры сохранения ключевой информации на устройстве

Запрет использования механизмов безопасности ОС

denyStoreWithOSProtection – флаг, запрещающий сохранение ключа с использованием механизмов безопасности операционной системы мобильного устройства (TouchID/FaceID, Google Key Store).

Требования к паролю

passPolicy указывает вариант требований к сложности пароля при сохранении ключевой информации на мобильном устройстве. Доступны следующие варианты:

  • «0» – минимум 6 символов, пароль не обязателен;
  • «1» – минимум 6 символов, пароль обязателен;
  • «2» – минимум 8 символов (обязательно использование A-Z и a-z) пароль обязателен;
  • «3» – минимум 8 символов (обязательно использование A-Z, a-z и 0-9) пароль обязателен.

Скоринг и автоподпись

Скоринг

scoring_enabled — разрешение "скоринга" устройства и поведенческого анализа с помощью дополнительного антифрод-модуля Secure Bank от Group IB. Лицензируется отдельно.

Автоподписание

autosign_enabled — разрешение автоподписи транзакций на основе результата скоринга устройства и поведенческого анализа. Для автоподписи используется дополнительная асимметричная ключевая пара.

Отложенный ввод в действие ключевой информации

delayed – флаг отложенного ввода в действие ключа. При его установке ключ, используемый для подтверждения транзакций и проверки кодов аутентификации, не заменяется. Сгенерированный новый ключ помечается как отложенный. Его ввод в действие выполняется одним из следующих способов:

  • путем вызова метода Ввод отложенного ключа в действие;
  • путем вызова одного из методов: Сохранение отпечатка устройства, Регистрация открытого ключа, Регистрация устройства для отправки PUSH-уведомлений с кодом аутентификации, сформированным на отложенном ключе. Выполнять обновление ключевой информации с флагом отложенного ввода можно неограниченное количество раз. При этом сформированная ранее отложенная ключевая информация будет заменена новой отложенной ключевой информацией. При выполнении обновления без данного флага вся отложенная ключевая информация далее считается недействительной и не может быть введена в действие.

Если значение опционального флага не указано, принимается значение равное «false».

Удалённый перевыпуск ключа

Если флаг установлен, то для ключа разрешена процедура перевыпуска ключевой инофрмации по инициативе мобильного приложения. Обязательным предусловием является действительность ключа на момент перевыпуска. Подробнее о процессе по ссылке.

Серверная подпись

Флаг, указывающий на то, что пользователь подлежит регистрации в модуле серверной подписи, а не в мобильном устройстве. При этом компонент серверной подписи (PCSS) должен быть развернут и настроен. Описание вызовов API для взаимодействия с компонентом доступно в описании API PC.

Флаг не может быть использован одновременно с флагом включения проверки отпечатка устройства.

Использование NFC-токенов

nfc_policy - флаг, определяющий политику использования NFC-токенов на мобильном устройстве для хранения ключа ЭП и генерации ЭП с использованием хранящегося на карте ключа ЭП. Доступны следующие варианты:

  • «0» – использование NFC-карты, хранащей закрытый ключ, на мобильном устройстве запрещено. Для всех криптографических операций используется ключевая пара генерируемая на самом мобильном устройстве;
  • «1» – использование NFC-карты, хранащей закрытый ключ, на мобильном устройстве опционально. В криптографических операциях может быть использована как ключевая пара, генерируемая на мобильном устройстве, так и ключевой контейнер, хранящийся на NFC-карте;
  • «2» – использование NFC-карты, хранащей закрытый ключ, на мобильном устройстве обязательно. Для всех криптографических операций используется ключевая пара, хранящаяся в контейнере на NFC-карте;

Если опциональное значение nfc_policy не установлено, принимается значение равное «0».

Кодирование значений флагов в составе ключевой информации

В составе QR-кода, значения передаются в 7-ой строке данных (для версии сервера 3.x) или в параметре "key_flags" (для версии сервера 5 и выше), целым числом. Значения флагов вычисляются с помощью битовой маски.

KEYFLAG_WITH_FINGERPINT = (1 << 0);
KEYFLAG_COLLECT_EVENTS = (1 << 1);
KEYFLAG_COLLECT_DEVICEINFO = (1 << 2);
KEYFLAG_COLLECT_SIMINFO = (1 << 3);
KEYFLAG_COLLECT_LOCATION = (1 << 4);
KEYFLAG_PASS_POLICY_POS = (1 << 5); // password policy encoded by 2 bits (4 values)
KEYFLAG_PASS_POLICY_POS = (1 << 6); // password policy encoded by 2 bits (4 values)
KEYFLAG_DENY_STORE_WITH_OS_PROTECTION = (1 << 7);
KEYFLAG_DENY_RENEW_PUBKEY = (1 << 8);
KEYFLAG_SCORING_ENABLED = (1 << 9);
KEYFLAG_AUTOSIGN_ENABLED = (1 << 10);
KEYFLAG_REMOTE_UPDATE_ENABLED = (1 << 11);
KEYFLAG_SERVERSIGNER = (1 << 12);
KEYFLAG_NFC_ENABLED_POS = (1 << 13); // NFC policy encoded by 2 bits (3 values is used)
KEYFLAG_NFC_ENABLED_POS = (1 << 14); // NFC policy encoded by 2 bits (3 values is used)

События

Свойства записи о событии

Наименование свойства события Описание
event_id Идентификатор события в журнале аудита системы
created_at Время создания записи в журнале аудита системы
user_id Идентификатор пользователя
transaction_id Идентификатор транзакции
session_id Идентификатор сессии на мобильном устройстве
device_event_id Идентификатор события на мобильном устройстве
device_time Время события на мобильном устройстве
auth_code Код аутентификации запроса
request_hash Хэш-сумма запроса
request_hmac Код аутентификации тела запроса
request_type Тип запроса/события
device_info Информация об устройстве
requester_ip_address IP адрес источника запроса
request_result Результат выполнения запроса (0 - успех, другое
operationid Идентификатор операции
c версии 5.3:
request_url Адрес
pc_version Компонент PC, его версия и версия API
system_id Идентификатор прикладной системы
connection_info Данные о сетевом подключении, связанного с событием
pc_instance_name Название экземпляра PC

Типы запросов/событий

Событие Описание
decline_transaction Отмена транзакции
autoconfirm_transaction Автоподтверждение транзакции
confirm_transaction Подтверждение транзакции
create_transaction Создание транзакции
get_autoconfirm_list Получение списка транзакций для автоподтверждения
get_transactions Получение списка транзакций
get_transaction_info Получение информации о транзакции
get_transaction_data Получение данных транзакции
get_transaction_binary_data Получение бинарных данных транзакции
attempt_scoring_details Детали скоринга попытки автоподтверждения
change_user Изменение пользователя
create_user Создание пользователя
renew_key_challenge Отправлен челлендж для подтверждения удалённого (по инициативе мобильного приложения) обновления ключевой информации
renew_key_response Получен ответ на челлендж для удалённого (по инициативе мобильного приложения) обновления ключевой информации
export_user_key Экспорт инициализационной ключевой информации
update_user_key Запрос на обновление ключа пользвателя
remote_update_user_key Запрос на обновление ключа пользвателя (QR-код + код активации, только через SOAP-API)
delete_user Удаление пользователя
get_user_info Получение информации о пользователе
remote_update_set_template Установка шаблона для удалённого восстановления ключа пользователя
remote_update_get_available_template Получение списка доступных шаблонов для удалённого восстановления ключа пользователя
remote_update_get_requisites Получение установленных параметров для удалённого восстановления ключевой информации
get_scoring_settings Получение параметров конфигурации скоринга
register_system Регистрация прикладной системы
get_system_info Получение информации о прикладной системе
change_system Изменение параметров прикладной системы
remove_system Удаление прикладной системы
system_report Получение функционального отчёта об использовании системы
billing_close Закрытие расчётного периода для постоплатной системы расчётов
rks_events_data Получение информации о событиях для указанного пользователя через АРМ РКС (или посредством API на эндпоинт РКС в составе API сервера PC Server)
rks_transactions_data Получение информации о транзакции через АРМ РКС (или посредством API на эндпоинт РКС в составе API PC Server)
rks_check_confirmation Проверка значения ЭП через АРМ РКС (или посредством API на эндпоинт РКС в составе API PC Server)
rks_user_details Получение информации о пользователе через АРМ РКС (или посредством API на эндпоинт РКС в составе API PC Server)
key_deleted Ключевая информация удалена с мобильного устройства
root_detected Обнаружен root/jailbreak на мобильном устройстве
high_risk_apps_detected Обнаружены потенциально вредоносные приложения
password_incorrect Введён некорректный пароль доступа к ключевой информации на мобильном устройстве
c версии 5.2:
get_signed_pdf Получение подписанного PDF
reassemble_pdf Добавление ране сформированной ЭП в оригинальный PDF файл
create_operation Создание операции
update_operation Изменение операции
get_operation_info Получение информации об операции
get_operation_list Получение списка операций
get_operation_data_list Получение данных операции
operations_process Обработка операций
get_event_info Получение подробной информации для указанного события
create_certificate Создание PKI сертификата пользователя Только в 5.2. С 5.3 изменено на create_certificate_request.
get_certificate_status Получение статуса сертификата пользователя
revoke_certificate Отзыв сертификата пользователя
rks_check_cms Проверка значения ЭП CMS через АРМ РКС (или посредством API на эндпоинт РКС в составе API PC Server)
rks_check_pdf Проверка значения ЭП PDF через АРМ РКС (или посредством API на эндпоинт РКС в составе API PC Server)
c версии 5.3:
get_events Получение событий с использованием фильтров при выполнении запроса
clean_events Очистка информации из записей о событиях, очищаются поля device_info, event_data, connection_info.
password_correct Событие ввода пароля
password_changed Событие изменения пароля
create_certificate_request Создание запроса на сертификат пользователя
issue_certificate Запрос на сертификат пользователя подписан. Выпуск сертификата
gen_confirm_code Генерация сервером кода подтверждения на симметричном ключе пользователя
check_confirm_code Проверка кода подтверждения выработанного на симметричном ключе пользователя для подтверждаемых без создания транзакции данных
gen_common_confirm_code Генерация сервером кода подтверждения на симметричном ключе сервера для подтверждаемых без создания транзакции данных
check_common_confirm_code Проверка кода подтверждения выработанного на симметричном ключе сервера для подтверждаемых без создания транзакции данных

Информация о мобильном устройстве

Сбор информации об устройстве – это возможность, которую может использовать организация, выпустившая ключ.

Флаги, разрешающие сбор информации, устанавливаются для ключа при его выпуске (эта возможность должна быть реализована в прикладной системе).

Состав информации

Собираемую информацию об устройстве можно разбить на две группы:

  • Информация, для сбора которой не требуется предоставление дополнительного разрешения приложению;
  • Информация, для сбора которой приложению требуется запросить дополнительные разрешения.

Для iOS и Android производится попытка собрать всю доступную информацию. Поля для собираемой информации для обеих платформ одинаковы. В зависимости от того, какая платформа какую информацию отдаёт, они либо заполняются, либо остаются пустыми.

Информация не требующая дополнительных разрешений

При включении опции сбора информации собирается (при наличии технической возможности получения такой информации):

  • базовая об устройстве:

    производитель, модель, версия ОС, часовой пояс, установленные значения языковых параметров устройства, а также сведения об аппаратных составляющих (марки процессора, дисплея и т.д.);

  • состояние памяти устройства:

    установлена, либо нет карта памяти, её объём, объём ОЗУ и встроенной памяти устройства;

  • информация о приложении (собственно об экземпляре, отправляющем эту информацию):

    Название, версия и идентификатор мобильного приложения (BundleID);

  • информация о Wi-Fi подключении:

    название подключённой сети, IP и MAC адрес;

  • информация о физических сенсорах устройства:

    вывод информации о доступных приложению данных физических сенсоров, таких как акселерометр, датчик освещённости и т.д.

Информация, требующая предоставление разрешения

При включении дополнительных двух опций можно включить сбор (при наличии технической возможности получения такой информации):

  • геоданных устройства (Android и iOS):

    значение долготы и широты;

  • информации о телефоне и SIM-карте (iOS разрешение не запрашивает):

    оператор сотовой связи, количество сим-карт, IMSI, IMEI

Пример

Для версий 5.0 - 5.2

{
    "device_event_id": "e71426df-be90-408a-bef5-111ffe60c831",
    "device_info": {
        "app": {
            "appName": "PayControl",
            "packageName": "org.paycontrol.app",
            "appVersionName": "5.0.135-Release",
            "appVersionCode": 135
        },
        "wifi": {
            "macAddress": "F6:32:A7:61:24:9D",
            "localIp": "192.168.19.173",
            "userAgent": "Mozilla\/5.0 (Linux; Android 10; SM-G970F Build\/QP1A.190711.020; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/84.0.4147.125 Mobile Safari\/537.36__Dalvik\/2.1.0 (Linux; U; Android 10; SM-G970F Build\/QP1A.190711.020)",
            "SSID": "SafeTech-2-5Ghz"
        },
        "memory": {
            "totalExternalMemorySize": "118032510976",
            "totalInternalMemorySize": "118053482496",
            "hasExternalSDCard": 1,
            "totalRAM": "5524932"
        },
        "sim": {
            "networkCountryIso": "ru",
            "phoneType": "GSM",
            "simCount": 2,
            "simCountryIso": "ru",
            "roaming": 0,
            "IMSI": "",
            "simOperatorName": "Beeline",
            "mmsUrl": "http:\/\/wap.samsungmobile.com\/uaprof\/SAMSUNGUAPROF.xml",
            "imei": "",
            "mmsAgent": "SAMSUNG-ANDROID-MMS\/SM-G970F",
            "simSerial": "",
            "networkOperatorName": "Beeline"
        },
        "sensor": {
            "minDelay": 2000,
            "vendor": "STM",
            "name": "LSM6DSO Acceleration Sensor",
            "maxRange": 78.453201293945,
            "type": 1,
            "version": 15932,
            "resolution": 0.0023942016996443
        },
        "location": {
            "latitude": "55,7888752",
            "accuracy": "96,00",
            "longitude": "37,5042244"
        },
        "device": {
            "screenWidth": 1080,
            "radioVersion": "G970FXXU8CTG4,G970FXXU8CTG4",
            "locale": "ru",
            "manufacturer": "samsung",
            "buildHost": "21HHAD24",
            "buildVersionCodeName": "REL",
            "osVersion": "10",
            "defaultBrowser": "com.android.chrome",
            "bootloader": "G970FXXU8CTG4",
            "root": 0,
            "fingerprint": "samsung\/beyond0lteser\/beyond0:10\/QP1A.190711.020\/G970FXXU8CTG4:user\/release-keys",
            "model": "SM-G970F",
            "hardware": "exynos9820",
            "product": "beyond0lteser",
            "simulator": 0,
            "buildBrand": "samsung",
            "buildTime": 1594894183000,
            "buildUser": "dpi",
            "screenHeight": 2119,
            "timeZone": "Europe\/Moscow",
            "cpu": "BogoMIPS=52.00;CPU implementer=0x53;CPU architecture=8;CPU variant=0x1;CPU revision=0;Features=fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm dcpop;processor=7;CPU part=0x003",
            "defaultSms": "com.samsung.android.messaging",
            "deviceID": "a450af03e00db165",
            "certificates": [

            ],
            "serial": "unknown",
            "displayVersion": "QP1A.190711.020.G970FXXU8CTG4",
            "name": "SV-SGS10e",
            "sdkVersion": 29,
            "screenDensity": "xxhdpi",
            "device": "beyond0",
            "board": "exynos9820",
            "releaseBuildVersion": "10"
        }
    },
    "event_id": 8210,
    "request_type": "get_transactions",
    "user_id": "stage51-7dbe69b2-4bdf-4a4f-a004-58e90131dde2",
    "request_hash": "562e21ae186ab3684011f70d23956549bb3af1fcf37d59503b34364749b94814",
    "session_id": "e3ef6099-d700-45e0-9988-e77197107030",
    "request_hmac": "ae5e6da7628bd95a81543013902bd0bdee25bc6aa64eb0f8c7b857d996dda3a9",
    "request_result": 0,
    "requester_ip_address": "31.173.87.93,192.168.117.19"
}

Для версии 5.3

Опционально, записи о событиях могут дополняться идентификатором экземпляра, который задаётся через установку параметра pc_instance_name окружения Java, например -Dpc_instance_name=pcs-node-1

{
    "transaction_id": "fc320b42-d6c0-4528-b2ae-f29389dbe8a6",
    "request_type": "confirm_transaction",
    "pc_instance_name": "pcs-node-1",
    "session_id": "cf52588e-9e9b-4730-83bc-88733b314a7e",
    "created_at": 1625599693574,
    "request_url": "http:\/\/localhost:8080\/pc-api\/ext\/e55d3d79-327e-4c23-b152-967a57258d57\/users\/devapi4postpay-e6c89a0c-7ca5-4d71-a01c-5f1d4b200c16\/transactions\/fc320b42-d6c0-4528-b2ae-f29389dbe8a6\/confirm",
    "requester_ip_address": "192.168.9.105, 192.168.8.52,172.19.0.3",
    "request_result": 0,
    "pc_version": {
        "pc_version": "5.3.201-pgsql",
        "product": "PC Server",
        "pc_api_version": 4
    },
    "device_event_id": "b06c4b3d-ac42-4445-baf5-58bcb9bb767c",
    "device_info": {
        "app": {
            "appName": "PayControl",
            "packageName": "org.paycontrol.app",
            "appVersionName": "5.2.197-Release",
            "appVersionCode": 197
        },
        "wifi": {
            "macAddress": "",
            "localIp": "192.168.9.105",
            "userAgent": "Mozilla\/5.0 (Linux; Android 11; SM-G970F Build\/RP1A.200720.012; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/91.0.4472.120 Mobile Safari\/537.36__Dalvik\/2.1.0 (Linux; U; Android 11; SM-G970F Build\/RP1A.200720.012)",
            "SSID": ""
        },
        "memory": {
            "totalExternalMemorySize": "118032510976",
            "totalInternalMemorySize": "118053482496",
            "hasExternalSDCard": 1,
            "totalRAM": "5546068"
        },
        "sim": {
            "networkCountryIso": "ru",
            "phoneType": "GSM",
            "simCount": 2,
            "simCountryIso": "ru",
            "roaming": 0,
            "IMSI": "",
            "simOperatorName": "Beeline",
            "mmsUrl": "http:\/\/wap.samsungmobile.com\/uaprof\/SAMSUNGUAPROF.xml",
            "imei": "",
            "mmsAgent": "SAMSUNG-ANDROID-MMS\/SM-G970F",
            "simSerial": "",
            "networkOperatorName": "Beeline"
        },
        "sensor": {
            "minDelay": 2000,
            "vendor": "STM",
            "name": "LSM6DSO Acceleration Sensor",
            "maxRange": 78.45320129394531,
            "type": 1,
            "version": 15932,
            "resolution": 0.002394201699644327
        },
        "location": {
            "latitude": "55.11000001",
            "accuracy": "48.00",
            "longitude": "37.2244004"
        },
        "device": {
            "screenWidth": 1080,
            "radioVersion": "G970FXXSBFUE6,G970FXXSBFUE6",
            "locale": "en",
            "manufacturer": "samsung",
            "buildHost": "21DJ6552",
            "buildVersionCodeName": "REL",
            "osVersion": "11",
            "defaultBrowser": "",
            "bootloader": "G970FXXSBFUE6",
            "root": 0,
            "fingerprint": "samsung\/beyond0lteser\/beyond0:11\/RP1A.200720.012\/G970FXXSBFUE6:user\/release-keys",
            "model": "SM-G970F",
            "hardware": "exynos9820",
            "product": "beyond0lteser",
            "simulator": 0,
            "buildBrand": "samsung",
            "buildTime": 1621935403000,
            "buildUser": "dpi",
            "screenHeight": 2119,
            "timeZone": "Europe\/Moscow",
            "cpu": "BogoMIPS=52.00;CPU implementer=0x53;CPU architecture=8;CPU variant=0x1;CPU revision=0;Features=fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm dcpop;processor=7;CPU part=0x003",
            "defaultSms": "com.samsung.android.messaging",
            "deviceID": "a450af01e11db222",
            "certificates": [],
            "serial": "",
            "displayVersion": "RP1A.200720.012.G970FXXSBFUE6",
            "name": "My-SGS10e",
            "sdkVersion": 30,
            "screenDensity": "xxhdpi",
            "device": "beyond0",
            "board": "exynos9820",
            "releaseBuildVersion": "11"
        }
    },
    "event_id": 72895,
    "system": "1f639fb8-8613-4461-8f14-61a73aced9c3",
    "connection_info": {
        "destination": {
            "port": "8080",
            "ip": "127.0.0.1",
            "mac": ""
        },
        "remote": {
            "port": "60598",
            "ip": "127.0.0.1",
            "mac": ""
        }
    },
    "user_id": "stageapi4postpay-c0b9784f-4d21-410c-901d-1e151dea745b",
    "request_hash": "8e5c46a112ab4bcfe4623462a08ab4ec7cf0434ba23c76efaccd3bf42fecea73",
    "device_time": 1625599692934,
    "request_hmac": "e1bf3050e2ca8b676073f4c13928bdac3fc29d759e82aeb905a0cda25d5c7026",
}

Коды ошибок сервисов

Код ошибки Идентификатор ошибки HTTP-код Описание
0 NORMAL 200 Ошибка отсутствует
100 JAVA_INTERNAL_ERROR 500 Внутренняя ошибка
200 SYSTEM_PROPERTY_ERROR Ошибка в настройках ИС
201 SYSTEM_ID_IS_NULL ID системы не задан
202 SYSTEM_ID_IS_WRONG ID системы неверен
203 SYSTEM_NOT_FOUND Система не найдена
204 SYSTEM_IS_DELETED Система удалена
205 SYSTEM_NAME_IS_NULL Имя системы не задано
206 USER_ID_IS_NULL ID пользователя не задан
207 USER_ID_PREF_IS_NULL Префикс ID пользователя не задан
208 USER_NOT_FOUND Пользователь не найден
209 USER_IS_DELETED Пользователь удален
210 DS_VERIFY_ERROR ЭП не верна
211 DS_STRUCT_ERROR Структура ЭП не верна
212 STORE_TYPE_IS_WRONG Тип хранилища неверен
213 KEY_CONTAINER_ALIAS_IS_NULL Alias ключевого контейнера не задан
214 KEY_CONTAINER_NOT_EXISTS Ключевой контейнер не существует
215 TRANSACTION_DATA_UID_ERROR Неверные данные транзакции (User ID не совпадает)
216 TRANSACTION_DATA_ERROR Неверные данные транзакции
217 TRANSACTION_DATA_IS_NULL Данные транзакции не заданы
218 REPORT_TPL_IS_NULL Неверный шаблон отчета
219 REQUEST_ERROR Ошибка в запросе
220 SYSTEM_ID_NOT_UNIQUE ID системы не уникален
221 REQUEST_SIGNATURE_NOT_VALID Подпись запроса невалидна
222 SYSTEM_NOT_VALID Система не является доверенной
231 TRANSACTION_IS_NULL Транзакция не найдена
232 TRANSACTION_CHECKED Данные транзакции уже проверены
233 ERROR_PARSE_REGISTER_SYSTEM_INFO Невозможно распознать запрос на регистрацию системы
234 INCORRECT_USER_TYPE Некорректный тип пользователя
235 COLLECTION_IS_EMPTY Пустая коллекция
236 NO_RESULT Резльтатов нет
237 PIN_IS_EMPTY Pin-код не задан
238 FPRINT_IS_EMPTY Отпечаток пользователя не задан
239 OTP_IS_NOT_VALID Неверный OTP
240 VALID_DATE_EXPIRED Истек срок регистрации
241 SYSTEM_TYPE_IS_WRONG Неверный тип системы
242 SPART_LENGTH_IS_WRONG Неверно задана длина 2-й части ключевой информации
243 DATA_TYPE_IS_WRONG Неверно задан тип данных
244 INVALID_HMAC 401 Код подтвержения неверен
245 KEY_INFO_NOT_FOUND Нет активной ключевой информации
246 WRONG_SYSTEM_TYPE Неверный тип системы
247 FPRINT_IS_NOT_EMPTY Отпечаток уже установлен
248 WRONG_AUTH_CODE 401 Неверный код аутентификации
249 CONFIRM_TYPE_IS_NULL Не задан тип подтверждения
250 STORE_TYPE_IS_NULL Не задан тип хранилища
251 DEVICE_TYPE_IS_NULL Не задан тип устройства
252 TRANSACTION_DATA_TYPE_IS_NULL Не задан тип данных
253 USER_ID_PREF_TOO_LONG Префикс ID превышает допустимую длину
254 CONFIRM_CODE_LENGTH_IS_WRONG 401 Неверно задана длина кода подтверждения
255 CONFIRM_CODE_IS_NULL Код подтверждения не задан
256 TRANSACTION_ID_IS_NULL ID транзакции не задан
257 STATUS_LIST_IS_EMPTY Не задан список статусов
258 DEVICE_ID_IS_NULL ID устройства не задано
259 DEVICE_TYPE_IS_INCORRECT Тип устройства неправильный
261 INVALID_OTP Код подтвержения неверен
263 INVALID_KDF Неподдерживаемый формат параметра kdfFunc
264 PIN_LENGTH_IS_WRONG Неверно задана длина пин-кода
265 PUSH_ID_IS_NULL Идентификатор уведомления не задан
267 TRANSACTION_STATUS_INVALID Статус транзакции неверный
268 AUTH_CODE_IS_NULL Код аутентификации не задан
269 STATUS_LIST_IS_INCORRECT Ошибка в списке статусов
270 DECLINE_REASON_IS_NULL Причина отмены не передана
271 TRANSACTION_IS_NOT_UNIQUE Транзакция с таким id уже существует
272 BILL_DATE_CORRUPTED Дата закрытия биллингового периода сохранена неверно
273 USER_BILL_DATE_CORRUPTED Дата закрытия биллингового периода пользователя сохранена неверно
274 TRANSACTION_IS_DELETED Транзакция помечена как удаленная
275 BILL_REQUEST_ALREADY_PROCESSED Биллинг на данную дату уже закрыт
276 PUBKEY_IS_EMPTY Открытый ключ отсутствует
277 PUBKEY_IS_NOT_EMPTY Открытый ключ уже установлен
278 SIGNATURE_IS_INVALID Подпись неверна
279 SIGNATURE_IS_NULL Подпись не задана
280 SIGNATURE_AND_CONFIRM_CODE_ARE_NULL Подпись или код подтверждения должны быть заданы
281 TRANSACTION_EXPIRED Вышло время жизни транзакции
282 JSON_SCHEME_NOT_SUPPORTED Версия JSON-запроса не поддерживается
283 JSON_REQUEST_INCORRECT JSON-запрос не соответствует схеме
284 LICENSE_UPDATE_ERROR Ошибка загрузки лицензии
285 LICENSE_EXPIRED Срок действия лицензии истёк
286 LICENSE_USER_COUNT_EXCEEDED Количество пользователей в лицензии достигнуто
287 BILLING_TYPE_CORRUPTED Тип лицензирования был изменен
288 HTTP_AUTH_CODE_INVALID 401 Авторизация по HTTP-заголовку неуспешна
289 NOT_SUPPORTED 404 Метод не поддерживается
290 EXT_AUTH_TEMPLATE_NOT_FOUND 401 Шаблон для дополнительной аутентификации не найден
291 EXT_AUTH_FAILED 401 Дополнительная аутентификация неуспешна
292 EXT_AUTH_TYPE_NOT_SUPPORTED Тип дополнительной аутентификации не поддерживается
293 EXT_AUTH_NEEDED Необходима внешняя аутентификация
294 USER_IS_BLOCKED Пользователь заблокирован
295 KEY_EXPIRED Срок действия ключа истёк
296 LICENSE_NOT_FOUND Лицензия не найдена
297 PUSH_NOT_FOUND Идентификатор уведомления не найден
298 SCORING_SETTINGS_IS_NULL Данные для скоринга должны быть установлены
299 AUTOSING_SIGNATURE_IS_INVALID Подпись неверна
300 SERVER_SCORING_SETTINGS_INCORRECT Настройки скоринга сервера неверны
301 SCORING_FAILED Ошибка получения скоринга
302 HIGH_SCORING_RISK_LEVEL Уровень риска слишком высок
304 AUTOSIGN_FAILED Ошибка автоподписи
305 AUTOSIGN_NOT_ALLOWED Автоподпись запрещена
306 ATTEMPT_ID_IS_NULL ID попытки не задан
307 FLEXIBLE_LICENSE_ERROR Ошибка flexible лицензии
309 LICENSE_ERROR Ошибка flexible лицензии
308 UNSUPPORTED_BILLING_TYPE Неподдерживаемый тип биллинга
310 OPERATION_NOT_EXISTS Операция не существует
311 TRANSACTION_IS_NOT_IN_OPERATION Транзакция не включена в операцию
312 OPERATION_STATUS_INVALID Статус операции невалидный
313 CREATE_OPERATION_ERROR Ошибка при создании операции
314 REMOTE_UPDATE_ERROR Ошибка обновления ключей по дополнительной аутентификации
315 REMOTE_UPDATE_ERROR_BLOCK Ошибка обновления ключей по дополнительной аутентификации, лимит попыток исчерпан, пользователь заблокирован
316 REMOTE_UPDATE_DISABLED Обновление ключа по дополнительной аутентификации отключено
317 OPERATION_EXPIRED Ошибка при создании операции
318 DN_IS_NULL Объект Distinguished Name должен быть установлен
319 CERT_REQUEST_PARAMS_IS_NULL Объект Certificate Request должен быть установлен
320 CERT_ISSUE_ERROR Ошибка выпуска сертификата
321 NO_CERT_REQUEST Запрос на сертификат или сертификат отсутствует
322 NO_CERT Сертификат отсутствует
323 NO_PKI_SETTINGS_DEFINED Файл настроек PKI не задан
324 CAN_NOT_USE_CERTIFICATE_CHAIN Не удается построить цепочку сертификации
325 CERT_STATUS_INVALID Неверный статус сертификата
326 CERT_REVOKE_ERROR Ошибка отзыва сертификата
327 CERT_DOES_NOT_MATCH Сертификат не совпадает
328 INCORRECT_TRANSACTION_TYPE Некорректный тип транзакции
329 INCORRECT_ACCESS_PERMISSIONS Некорректные права доступа к файлу
330 INCORRECT_PDF_DATA Некорректный pdf-file
331 PDF_DATA_NOT_COMPLIES_CMS Двоичные данные pdf не соответствуют CMS транзакции
333 URL_SCHEME_NOT_DEFINED URL-схема не задана

Темы оформления мобильного приложения

Структура архива темы

Файл темы оформления должен соответстововать идентификатору прикладной системы + расширение .zip.

Состав файла:

  • theme.json ­— Описание темы
  • image_light.png ­— Кастомная картинка для светлого режима приложения
  • image_dark.png ­— Кастомная картинка для тёмного режима приложения

Структура файла theme.json

{
    "colors": {
        "accentColor": {
            "light": "#006BFF",
            "dark": "#2F98FF"
        },
        "textButton": {
            "light": "#006BFF",
            "dark": "#2F98FF"
        },
        "accentText": {
            "light": "#006BFF",
            "dark": "#2F98FF"
        },
        "declineButton": {
            "light": "#CFD4DE",
            "dark": "#3C4048"
        },
        "barButton": {
            "light": "#A0AABD",
            "dark": "#6D7586"
        },
        "error": {
            "light": "#E53D00",
            "dark": "#F95E25"
        },
        "success": {
            "light": "#006BFF",
            "dark": "#2F98FF"
        }
    },
    "icon": {
        "light": "icon_light.png",
        "dark": "icon_dark.png"
    },
    "image": {
        "light": "icon_light.png",
        "dark": "icon_dark.png"
    },
    "about": "https://safe-tech.ru/about",
    "feedback": "info@safe-tech.ru"
}

Цвета (Colors)

Цвета описываются в формате #RRGGBB для светлой и тёмной темы по-отдельности.

Name Где встречается
accentColor Цвет всех основных кнопок, подсветка полей
textButton Цвет текстовых кнопок. Например, ссылки в информации о ключе
accentText Цвет статусов. Например, «доступно 2 операции»
declineButton Кнопка «Отклонить»
barButton Цвет иконок в AppBar'е / NavigationBar'е
success Цвет успешных статусов. Например, фон круга в модальном окне с надписью «Готово».

Иконки/логотипы

В теме могут содержаться логотип или иконка. Необходимо указать название картинки для светлой и тёмной темы. Может использоваться всего одна картинка, указав одно и тоже название для light и dark.

В первую очередь приложение ищет большой логотип по ключу image . Если её нет, то далее приложение ищет иконку по ключу icon. Если и её нет — то будет использоваться дефолтная иконка.

Т.е. если будут указаны оба ключа, то приоритет у image.

Если логотип в приложении не отображается, сверьте название картинки в архиве с тем, что указано в ключе.

Логотип

Если необходимо использование логотипа, то необходимо указать ключ image с названием картинок для светлой и тёмной тем.

Область, которую будет занимать логотип, имеет динамическую ширину. Картинка будет размещена по центру и сжата по высоте.

Рекомендуемый размер логотипа — не менее 792x396, соотношение сторон 2:1

Иконка

Если необходимо использование небольшой иконки, то необходимо указать ключ icon с названием картинок для светлой и тёмной тем.

Иконка будет размещена в квадратной области.

Рекомендуемое разрешение 80x80, соотношение сторон 1:1.

"О приложении" и "Обратная связь"

В тему можно добавить дополнительные ключи — about и feedback. Они будут отображены как текстовые ссылки в информации о ключе.

Name Где встречается
about Ссылка на адрес сайта
feedback Адрес эл. почты для обратной связи

WildFly

Настройка

Запуск CLI

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

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

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

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

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

При конфигурировании Wildfly можно (при переводе системы в промышленную эксплуатацию — рекомендуется) удалить пример источника данных и страницу-приветствие.

С помощью CLI

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()

Путём конфигурирования файла 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>

Добавление источников данных (БД), на примере 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

Формат параметра Connection URL для разных типов СУБД

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

Валидация подключения

PostgreSQL
    <validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter>
    </validation>
Oracle
    <validation>
        <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
        <validate-on-match>false</validate-on-match>
        <background-validation>true</background-validation>
        <background-validation-millis>10000</background-validation-millis>
    </validation>
MS SQL
    <validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
    </validation>

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

HTTPS

Для выбора стандарта защиты 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

Включение дополнительных заголовков

Для включения дополнительных HTTP заголовков необходимо в файл

  • Linux: /opt/wildfly/standalone/configuration/standalone.xml
  • Windows: C:\wildfly\standalone\configuration\standalone.xml
  1. добавить фильтры в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавив блок (при его отсутствии) <filters></filters> следующего содержания:

            <filters>
                <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/>
                <response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/>
                <response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/>
                <response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/>
            </filters>
    
  2. добавить ссылки на эти фильтры в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> в <server name="default-server"> в <host name="default-host" alias="localhost"> включив следующие строки:

                    <filter-ref name="transport-security"/>
                    <filter-ref name="x-frame-options"/>
                    <filter-ref name="x-content-type-options"/>
                    <filter-ref name="Content-Security-Policy"/>
    

Пример:

<subsystem xmlns="urn:jboss:domain:undertow:11.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"/>
            <filter-ref name="x-frame-options"/>
            <filter-ref name="x-content-type-options"/>
            <filter-ref name="Content-Security-Policy"/>
        </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"/>
        <response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/>
        <response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/>
        <response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/>
    </filters>
</subsystem>

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

Для изменения номера порта необходимо в файле /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 необходимо перезапустить.

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

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

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

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

    JAVA_OPTS="$JAVA_OPTS -Dpc_url=http[s]://<IP или DNS-имя>[:PORT]/pc-api/ -Duser.language=ru -Dpaycontrol.locale=ru"
    

    в параметре -Dpc_url=http[s]://<IP или DNS-имя>[:PORT]/pc-api/ установить новое значение [PORT].

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

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

update pc_system set pc_is_internal_url='http[s]://<IP или DNS-имя>[:PORT]/pc-pusher-api/' where systemid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';

где

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

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

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

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

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

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

где

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

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

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

Установка имени хоста для публикации WSDL-схемы

Актуально для версии PC v.3.x, в случае, если фактическое имя хоста, по которому доступна WSDL-схема отличается от определяемого WildFly'ем имени.

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

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

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

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

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

  • Linux:

    /opt/wildfly/standalone/log/server.log

  • Windows: C:\wildfly\standalone\log\server.log

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

Направление логов Wildfly в Kafka

Исходник https://developer.jboss.org/docs/DOC-56423. Основное отличие - добавление <module name="com.fasterxml.jackson.core.jackson-databind"/> в зависимости модуля org.apache.kafka.clients.

Модули

Файлы модулей можно загрузить с https://mvnrepository.com/

org.apache.kafka.clients

Создать файл /opt/wildfly/modules/system/layers/base/org/apache/kafka/clients/main/module.xml с содержанием

<?xml version="1.0" encoding="UTF-8"?>
<module name="org.apache.kafka.clients" xmlns="urn:jboss:module:1.8">
    <resources>
        <resource-root path="kafka-clients-2.6.0.jar"/>
        <resource-root path="snappy-java-1.1.8.2.jar"/>
        <resource-root path="lz4-java-1.7.1.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="org.slf4j"/>
        <module name="com.fasterxml.jackson.core.jackson-databind"/>
    </dependencies>
</module>

и добавить в директорию указанные в блоке resources файлы.

org.apache.kafka.log4jappender

Создать файл /opt/wildfly/modules/system/layers/base/org/apache/kafka/log4jappender/main/module.xml с содержанием

<?xml version="1.0" encoding="UTF-8"?>
<module name="org.apache.kafka.log4jappender" xmlns="urn:jboss:module:1.8">
    <resources>
        <resource-root path="kafka-log4j-appender-2.6.0.jar"/>
        <resource-root path="slf4j-log4j12-1.7.30.jar"/>
    </resources>
    <dependencies>
        <module name="org.slf4j"/>
        <module name="org.apache.kafka.clients" />
        <module name="org.jboss.log4j.logmanager" />
    </dependencies>
</module>

и добавить в директорию указанные в блоке resources файлы.

org.apache.log4j

Добавить модуль log4jappender в качестве зависимости в существующий org.apache.log4j модуль:

<module name="org.apache.log4j" xmlns="urn:jboss:module:1.6">

    ...

    <dependencies>

        ...

        <module name="org.apache.kafka.log4jappender" export="true"/>

    </dependencies>

</module>
org.jboss.as.standalone

Указать в имеющемся модуле org.jboss.as.standalone в качестве зависимости модуль org.apache.kafka.clients.

<module name="org.jboss.as.standalone" xmlns="urn:jboss:module:1.6">

    ...

    <dependencies>

        ...

        <module name="org.apache.kafka.clients" />

    </dependencies>

</module>

Хэндлеры

Необходимо добавить перечисленные ниже хэндлеры в файл standalone.xml в блок <subsystem xmlns="urn:jboss:domain:logging:8.0">

kafka
            <custom-handler name="kafka" class="org.apache.kafka.log4jappender.KafkaLog4jAppender" module="org.apache.log4j">
                <level name="INFO"/>
                <formatter>
                    <named-formatter name="PATTERN"/>
                </formatter>
                <properties>
                    <property name="brokerList" value="localhost:9092"/>
                    <property name="topic" value="out-topic"/>
                </properties>
            </custom-handler>
async-kafka-wrapper
            <async-handler name="async-kafka-wrapper">
                <level name="ALL"/> 
                <queue-length value="1024"/> 
                <overflow-action value="block"/> 
                <subhandlers> 
                    <handler name="kafka"/> 
                </subhandlers> 
            </async-handler>
Включение хэндлера

В блок <handlers> добавить <handler name="async-kafka-wrapper"/>

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

Актуально для версии PC v.3.x.

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

  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 при развёртывании у заказчика.

Не происходит «биндинг» 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-сервере

Частое появление 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>