Создание и установка сертификатов сервера приложений 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"

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

_images/image-sw-1.png

Просмотреть список объектов в хранилище

keytool -list -keystore server.keystore -storepass secret

Видно, что объекту будет присвоен алиас

_images/image-sw-2.png

Генерация запроса на сертификат

В качестве алиаса, надо указать алиас, под которым в хранилище размещен ключ, которым подписывается создаваемый запрос

Генерация подписанного запроса на сертификат

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

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

_images/image-sw-3.png

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

Результатом является файл запроса на выпуск сертификата server-cert.csr, контент которого выглядит примерно так

_images/image-sw-4.png

Выпуск сертификата в удостоверяющем центре

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

_images/image-sw-5.png

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

_images/image-sw-6.png _images/image-sw-7.png

Импорт выпущенного сертификата в хранилище

keytool -import -trustcacerts -alias selfsigned-cert -file certnew.p7b -keystore server.keystore -storepass secret
_images/image-sw-8.png

Установка на сервер приложений готового сертификата

Импорт сертификата из 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 это пароль от самого кейстора.


Оринигал инструкции

https://support.embotics.com/support/solutions/articles/8000035243-generating-and-installing-an-ssl-certificate-with-active-directory-certificate-services

Сертификаты клиента

Для аутентификации сервером клиентов по сертификату, необходимо клиентские сертификаты (без приватного ключа) разместить в хранилище на сервере, и зарегестрировать данное хранилище в качестве хранилища с доверенными сертификатами. Получить клиентские сертификаты можно двумя способами - 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)

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

_images/image-sw-9.png

Решение проблемы невозможности найти библиотеки 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