======================================================================== Создание и установка сертификатов сервера приложений 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" При генерации будет спрошен пароль, которым будет защищен доступ к приватному ключу сертификата. .. image:: images/image-sw-1.png Просмотреть список объектов в хранилище :: keytool -list -keystore server.keystore -storepass secret Видно, что объекту будет присвоен алиас .. image:: 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 В процессе запроса будет запрошен пароль к приватному ключу сертификата, которым подписывается запрос. .. image:: images/image-sw-3.png Обратите внимание, что добавлено расширение сертификата **subject alternative name (SAN)**, которое позволяет (обязательное требования для сертификатов серверов) указать доменное имя и/или IP адрес, по которому происходит обращение к серверу (для которого создается сертификат). В качестве доменного имени можно указать localhost. Результатом является файл запроса на выпуск сертификата **server-cert.csr**, контент которого выглядит примерно так .. image:: images/image-sw-4.png Выпуск сертификата в удостоверяющем центре ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Далее, выпускаем сертификат в УЦ. В качестве примера приведены скриншоты с УЦ, установленного хосте тестового контролера домена. У пользователя должен быть доступ к серверу. .. image:: images/image-sw-5.png Как результат выпуска сертификата, можем скачать файл выпущенного сертификата или цепочку сертификатов для выпущенного сертификата. .. image:: images/image-sw-6.png .. image:: images/image-sw-7.png Импорт выпущенного сертификата в хранилище ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: keytool -import -trustcacerts -alias selfsigned-cert -file certnew.p7b -keystore server.keystore -storepass secret .. image:: 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) Пример включения обязательной проверки клиентского сертификата, через интерфейс настройки сервера. .. image:: 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