4.6. Настройка ssl-сертификатов на компонентах ServiceGate

Сервисы ServiceGate для хранения сертификатов и ключей SSL используют специальное хранилище в формате Java Keystore (далее JKS). Для работы с JKS необходима утилита keytool, которая идет в комплекте с Java JDK.

Ниже будут описаны настройки Sgate, которые необходимо сделать для работы SSL, а также примеры формирования хранилища JKS.

4.6.1. Описание настроек SSL, которые хранятся в Vault

В Vault хранятся следующие настройки SSL:

sgate/common/ssl.enabled
Включает/выключает поддержку SSL сервисом (true или false).
ssl.store-path
Путь к хранилищу ключей SSL в контейнере. Путь, по которому сервис будет выполнять поиск файла keystore.jks относительно своего classpath (если запускается сервис в контейнере, то в classpath по умолчанию входит /app/resources, /app/classes, /app/libs/).
sgate/common/ssl.store-pass
Пароль к хранилищу ключей SSL (пароль на хранилище keystore).
sgate/common/ssl.key-pass
Пароль к ключу в хранилище (пароль на закрытый ключ).

Примечание

Существует список общих настроек SSL, которые хранятся в Vault. Но есть возможность указать те же настройки SSL и для каждого сервиса отдельно. В этом случае приоритет у последних будет выше.

4.6.2. Пример генерации параметра «keystore» с самоподписанным сертификатом

Параметры «keystore» и «keypass» задают пароли на хранилище и закрытый ключ. Эти параметры необходимо указать в Vault соответственно по путям sgate/common/ssl.store-pass и sgate/common/ssl.key-pass:

keytool -genkey -dname "cn=sgate-test.igtel.ru, ou=dev, o=IGTEL, c=RU"
-alias sgate-dev -keypass 123456 -keystore ./keystore.jks -storepass 123456 -validity 3650
-keyalg RSA -ext SAN=dns:sgate-test.igtel.ru

4.6.3. Пример создания параметра «keystore» на основе существующей цепочки сертфикатов и закрытого ключа

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

  1. Создать хранилище PFX (PKCS#12):

    openssl pkcs12 -export -in cert-chain.pem -inkey private.key
    -name sgate-test.igtel.ru -out sgate-test.igtel.ru.pfx
    
  2. Создать новый Java keystore в формате JKS и импортируем туда PFX:

    keytool -importkeystore -destkeystore keystore.jks
    -srckeystore sgate-test.igtel.ru.pfx -srcstoretype PKCS12
    

4.6.4. Настройка SSL в сервисах ServiceGate

Настройка SSL в сервисе бэкенда выполняется одним из двух способов:

  1. В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то достаточно положить готовый keystore внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/ssl/keystore.jks. В данном случае всеми сервисами будет использован общий файл keystore.jks.

    Для того, чтобы сервис задействовал SSL необходим включенный параметр ssl.enabled (см. Описание настроек SSL, которые хранятся в Vault).

    При обновлении файла JKS потребуется перезапуск сервисов.

  2. В случае если используется самостоятельное разворачивание контейнера в собственной среде Docker, то необходимо обеспечить наличие хранилища JKS внутри контейнера относительно classpath приложения (как правило, достаточно положить в /app/resources контейнера).

4.6.5. Настройка SSL в сервисе UI (фронтенда)

Контейнер с UI поставляется с Nginx. Если необходимо включить SSL на уровне контейнера с UI, то следует руководствоваться соответствующуей документацией по настройке на официальном сайте Nginx (https://nginx.org/).

Если используется заранее подготовленный образ виртуальной машины ServiceGate, то настройки Nginx находятся внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/sgate-ui/nginx.

Затем, после сделанных настроек внутри виртуальной машины ServiceGate для Nginx, можно отправить сигнал процессу Nginx на перезапуск конфигурации командой:

docker exec sgate-docker_ui_1 nginx -s reload.

4.6.6. Настройка SSL для Vault

В данном разделе описываются необходимые настройки для доступа к Vault по протоколу HTTPS, но не настройки аутентификации через SSL/TLS.

В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то необходимо настроить tls listener по пути /etc/vault/config.hcl:

listener "tcp" {
   address = "0.0.0.0:8200"
   tls_disable = 0
   tls_cert_file = "/etc/certs/vault.crt"
   tls_key_file  = "/etc/certs/vault.key"
}

Здесь tls_disable = 0 включает SSL, tls_cert_file и tls_key_file указывают на пути к файлам сертификата и закрытого ключа.

Это минимальные настройки внутри файла config.hcl для включения HTTPS, см. дополнительную информацию по настройке Vault по ссылке https://www.vaultproject.io/docs/configuration/listener/tcp.

Далее необходимо прописать HTTPS для переменной VAULT_ADDR в файле /home/sgate/.bash_profile (необходимо для консольного подключения к Vault и для сервиса vault-auto-unseal):

VAULT_ADDR="https://127.0.0.1:8200"

Контейнеры с сервисами используют HTTP API для аутентификации через token. Для того, чтобы они подключались к Vault по протоколу HTTPS необходимо в файле /home/sgate/sgate-docker/.env скорректировать URL:

VAULT_URL=https://sgate-test.igtel.ru:8200

Затем необходимо перезапустить контейнеры встроенной командой sgate-ctl stopall / sgate-ctl startall (команды находятся в процессе разработки, синтаксис может измениться в будущем):

[sgate@sgate-test scripts]$ sgate-ctl stopall
Stopping sgate-docker_ui_1               ...
Stopping sgate-docker_ui_1               ... done
Stopping sgate-docker_integration-solr_1 ... done
Stopping sgate-docker_integration-db_1   ... done
Stopping sgate-docker_integration-ldap_1 ... done

[sgate@sgate-test scripts]$ sgate-ctl startall
Starting backend          ... done
Starting integration-db   ... done
Starting integration-ldap ... done
Starting integration-solr ... done
Starting ui               ... done

Примечание

Если для Vault используется самоподписанный сертификат или сертификат подписанный удостоверяющим центром предприятия, то может потребоваться правка файла cacerts на уровне JDK контейнеров.

В файле cacerts содержатся сертификаты УЦ.

Пример команды для подключения собственного файла сертификата УЦ:

keytool -import -alias new-cert -keystore /opt/openjdk-14/lib/security/cacerts -storepass changeit -file ca.pem

Далее измененный cacerts необходимо добавить внутрь контейнеров сервисов по пути /opt/openjdk-14/lib/security/cacerts (в дальнейшем путь может измениться при переходе на другие версии JDK).