Создание и установка сертификатов сервера приложений WildFly (JBoss EAP)¶
Сертификат сервера¶
Установить сертификат сервера можно двумя способами:
- Сформировать запрос на хосте, где установлен сервер приложений, подписать запрос в удостоверяющем центре, установить сертификат на хост.
- Установить готовый сертификат. В этом случае, приватный ключ не генерируется на сервере а импортируется вместе с сертификатом.
Для примера приведем обе процедуры, с использованием в качестве удостоверячего центра, частный УЦ от майкрософт, из состава Microsoft Windows Server 2012R.
Для манипулирования хранилищами и сертификатами на Linux хосте, будет использована утилита командной строки keytool.
Создание запроса на сертификат на сервере приложений¶
Спецификой создания запроса, который будет обрабатываться на УЦ от майкрософта, является то, что запрос должен быть обязательно подписан сертификатом (хотя бы самоподписанным сертификатом). Подпись запроса просто с использованием ключа, без сертификата, не будет принята в УЦ от майкрософта.
Поэтому, на первом шаге, генерируем самоподписанный серитификат.
Генерация ключевой пары¶
keytool -genkey -alias selfsigned-cert -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 3650 -keystore server.keystore -storepass secret -dname "cn=Alex Vrubel, ou=Robin, o=ITBR, L=Moscow, ST=Moscow, C=RU"
При генерации будет спрошен пароль, которым будет защищен доступ к приватному ключу сертификата.

Просмотреть список объектов в хранилище
keytool -list -keystore server.keystore -storepass secret
Видно, что объекту будет присвоен алиас

Генерация запроса на сертификат¶
В качестве алиаса, надо указать алиас, под которым в хранилище размещен ключ, которым подписывается создаваемый запрос
Генерация подписанного запроса на сертификат
keytool -certreq -keyalg RSA -alias selfsigned-cert -file server-cert.csr -keystore server.keystore -storepass secret -ext san=dns:app-server.robin.it.ru,ip:172.28.4.20
В процессе запроса будет запрошен пароль к приватному ключу сертификата, которым подписывается запрос.

Обратите внимание, что добавлено расширение сертификата subject alternative name (SAN), которое позволяет (обязательное требования для сертификатов серверов) указать доменное имя и/или IP адрес, по которому происходит обращение к серверу (для которого создается сертификат). В качестве доменного имени можно указать localhost.
Результатом является файл запроса на выпуск сертификата server-cert.csr, контент которого выглядит примерно так

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

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


Импорт выпущенного сертификата в хранилище¶
keytool -import -trustcacerts -alias selfsigned-cert -file certnew.p7b -keystore server.keystore -storepass secret

Установка на сервер приложений готового сертификата¶
Импорт сертификата из pfx
Можно импортировать сертификат с ключом из PFX файла.
keytool -importkeystore -srckeystore app-server.robin.it.ru.pfx -srcstoretype pkcs12 -deststoretype JKS
При этом алиас будет установлен в какое то дикое значение. Но мы можем поменять имя алиаса и установить новый пароль для алиаса (читай - для доступа к приватному ключу сертификата), используя полезные команды, которые описаны тут
https://blog.blundellapps.co.uk/tut-change-alias-passwords-of-your-android-keystore/
Регистрация сертификатов на сервере приложения¶
Копируем хранилище, содержащее серверный сертификат, в файловую структуру сервера приложений
cp server.keystore $JBOSS_HOME/standalone/configuration
Далее конфигурируем подсистему безопасности Elytron, как описано в оригинальной статье
batch
/subsystem=elytron/key-store=demoKeyStore:add(path=server.keystore,relative-to=jboss.server.config.dir, credential-reference={clear-text=secret},type=JKS)
/subsystem=elytron/key-manager=demoKeyManager:add(key-store=demoKeyStore,credential-reference={clear-text=Qwerty123})
/subsystem=elytron/server-ssl-context=demoSSLContext:add(key-manager=demoKeyManager,protocols=["TLSv1.2"])
# This is only needed if WildFly uses by default the Legacy security realm (по умолчанию это так)
/subsystem=undertow/server=default-server/https-listener=https:undefine-attribute(name=security-realm)
/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=ssl-context,value=demoSSLContext)
run-batch
reload
Обратите внимание на Qwerty123 - это пароль от приватного ключа сертификата, что лежит в хранилище server.keystore, а secret это пароль от самого кейстора.
Оринигал инструкции
Сертификаты клиента¶
Для аутентификации сервером клиентов по сертификату, необходимо клиентские сертификаты (без приватного ключа) разместить в хранилище на сервере, и зарегестрировать данное хранилище в качестве хранилища с доверенными сертификатами. Получить клиентские сертификаты можно двумя способами - 1. сгенерировать их на сервере и отдать пользователю (в нашем случае клиентскому приложению) с приватным ключом, 2. импортировать уже существующий сертификат в хранилище.
Генерация клиентского сертификата на сервере¶
Пример генерации клиентского сертификата на сервере
keytool -genkey -keystore client.keystore -storepass secret -validity 365 -keyalg RSA -keysize 2048 -storetype pkcs12 -dname "cn=Sergey Garnov, ou=Robin, o=ITBR, L=Moscow, ST=Moscow, C=RU"
keytool -exportcert -keystore client.keystore -storetype pkcs12 -storepass secret -keypass secret -file client.crt
keytool -import -file client.crt -alias Garnov -keystore client.truststore -storepass secret
keytool -importkeystore -srckeystore client.keystore -srcstorepass secret -destkeystore GarnovCert.p12 -srcstoretype PKCS12 -deststoretype PKCS12 -deststorepass secret
Импорт сертификата клиента¶
keytool -import -file vrubel.cer -alias quickstartUser -keystore client.truststore -storepass secret
TODO: проверить с вновь выпущенными сертификатами
Включения режима двусторонней аутентификации¶
Создание хранилища доверенных клиентских сертификатов
/subsystem=elytron/key-store=demoTrustStore:add(path=client.truststore,relative-to=jboss.server.config.dir,type=JKS,credential-reference={clear-text=secret})
/subsystem=elytron/trust-manager=demoTrustManager:add(key-store=demoTrustStore)
Пример включения обязательной проверки клиентского сертификата, через интерфейс настройки сервера.

Решение проблемы невозможности найти библиотеки libssl, при переходе на использование openssl¶
libcrypto++6
libssl1.1
запускать с указанием места расположения libssl
./standalone.sh -b=172.28.4.20 -bmanagement=172.28.4.20 -Dorg.wildfly.openssl.path=/usr/lib/x86_64-linux-gnu/
Импорт сертификата клиента в формате PFX¶
Пароли ключа и контейнера (целевых) должны совпадать
Пример импорта сертификата в формате PFX в хранилище
keytool -importkeystore -srckeystore vrubel.pfx -srcstorepass Qwerty123 -destkeystore client.keystore -srcstoretype PKCS12 -deststoretype PKCS12 -deststorepass Qwerty123 -destkeypass Qwerty123