Обновление ключей для JWT-токенов

В ELMA365 при аутентификации пользователей применяются JWT‑токены (JSON Web Token). Они автоматически выдаются сотрудникам после успешного ввода логина и пароля и используются для их авторизации при обращении к системе.

Для проверки актуальности выданных токенов применяются TLS‑сертификат и ключ. Они генерируются автоматически при установке системы. Для повышения безопасности рекомендуется регулярно обновлять эти ключи — не реже одного раза в год.

Чтобы минимизировать влияния этого процесса на работу пользователей, в ELMA365 можно настроить плавный переход на обновлённые ключи. Для этого нужно:

 

  1. Создать новые TLS‑сертификат и ключ для проверки JWT‑токена пользователя и сохранить их в секретах сервиса vahter.
  2. Определить дату удаления старого TLS‑сертификата и ключа для JWT‑токена.
  3. Пока старый TLS‑сертификат и ключ остаются активными, заверенные ими JWT‑токены обновятся автоматически, когда пользователь совершит какое‑либо действие в системе.
  4. Если в процессе смены ключей пользователь не работает в системе, при следующем входе ему нужно повторно ввести логин и пароль, чтобы получить JWT‑токен, проверенный новым ключом.

 

Настройка обновления TLS‑сертификата и ключа для JWT‑токенов отличается в зависимости от способа установки системы:

 

Обновление ключей JWT‑токенов для ELMA365 в Kubernetes

Для вариантов установки ELMA365 On‑Premises Standard Kubernetes и ELMA365 On‑Premises Enterprise выполните шаги:

  1. Получите TLS‑сертификат и ключ одним из способов:
  1. Используйте готовый TLS-сертификат и ключ.
  2. Сформируйте их при помощи команд:
  • TLS‑сертификат:

openssl req -newkey rsa:4096 -nodes -keyout cryptedjwtTls.key -x509 -sha256 -days 365 -subj "/C=RU/O=ELMA365/CN=MYDOMAIN.COM" -addext "subjectAltName = DNS:MYDOMAIN.COM" -out jwtTls.crt

  • ключ:

openssl rsa -in cryptedjwtTls.key -traditional -out jwtTls.key

Где:

  • -days 365 — срок действия TLS-сертификата в днях;
  • MYDOMAIN.COM — домен компании;
  • jwtTls.crt — имя файла TLS‑сертификата;
  • jwtTls.key — имя файла ключа.
  1. Откройте файл values-elma365.yaml и в блоке Настройка микросервиса vahter включите параметр renewToken, установив значение true:

vahter:
  secrets:
    renewToken:
      enabled: true

  1. Настройте параметры обновления TLS‑сертификата и ключа для JWT‑токенов:

vahter:
  secrets:
    renewToken:
      enabled: true
      schedule: "0 * * * *"
      oldTokenExpiry: "2025-05-14"
      certNew: |
        -----BEGIN CERTIFICATE-----
        ... 
        -----END CERTIFICATE-----
      keyNew: |
        -----BEGIN RSA PRIVATE KEY-----
        ... 
        -----END RSA PRIVATE KEY-----

Где:

  • schedule — установите расписание, по которому будут выполняться автоматический запуск cronjob и замена старых ключей. Для примера указан запуск каждый час, каждый день.
     
    cronjob — это инструмент в Kubernetes, который позволяет задать расписание повторяющейся операции. Подробнее о правилах настройки cronjob читайте на официальном сайте Kubernetes;
  • oldTokenExpiry — дата, когда пользователи со старыми JWT‑токенами больше не смогут войти в систему. Для примера указано: 2025-05-14;
  • certNew — укажите TLS-сертификат, скопировав содержимое файла jwtTls.crt, который вы получили на первом шаге;
  • keyNew — укажите ключ, скопировав содержимое файла jwtTls.key, который вы получили на первом шаге.
  1. Выполните обновление сервисов системы при помощи команды:

helm upgrade elma365 elma365/elma365 values-elma365.yaml

После обновления новый TLS‑сертификат и ключ запишутся в секреты сервиса vahter. Когда наступит дата, указанная в параметре oldTokenExpiry, старый TLS‑сертификат и ключ для JWT токенов удалятся.

  1. Для повышения безопасности удалите введённые на шаге три данные TLS‑сертификата и ключа из файла конфигурации values-elma365.yaml либо ограничьте доступ к этому файлу.

Обновление ключей JWT-токенов для ELMA365 в KinD

Для варианта установки ELMA365 On-Premises Standard в KinD выполните шаги:

  1. Чтобы настроить обновление ключей JWT‑токенов, перейдите в docker‑контейнер приложения ELMA365 с помощью команды:

docker exec -it elma365 /bin/bash

Где elma365 — имя docker-контейнера.

  1. Получите TLS‑сертификат и ключ одним из способов:
  1. Используйте готовый TLS‑сертификат и ключ.
  2. Сформируйте в docker‑контейнере TLS‑сертификат и ключ с помощью команды:

openssl genrsa -out jwtTls.key 4096 && openssl req -new -key jwtTls.key -nodes -x509 -sha256 -days 365 -subj "/C=RU/O=ELMA365/CN=MYDOMAIN.COM" -addext "subjectAltName = DNS:MYDOMAIN.COM" -out jwtTls.crt

Где:

  • -days 365 — срок действия TLS-сертификата в днях;
  • MYDOMAIN.COM — домен компании;
  • jwtTls.crt — имя файла TLS-сертификата;
  • jwtTls.key — имя файла ключа.
  1. Для процесса замены JWT‑токенов, который не потребует от пользователей повторного ввода логина и пароля, добавьте новые TLS‑сертификат и ключ в секреты сервиса vahter с помощью команд:

 

BASE64_KEY=$(cat jwtTls.key | base64 -w 0) && kubectl patch secret vahter-jwt -n <namespace> --type='json' -p="[{\"op\": \"add\", \"path\": \"/data/tls_new.key\", \"value\": \"$BASE64_KEY\"}]"

 

BASE64_CERT=$(cat jwtTls.crt | base64 -w 0) && kubectl patch secret vahter-jwt -n <namespace> --type='json' -p="[{\"op\": \"add\", \"path\": \"/data/tls_new.crt\", \"value\": \"$BASE64_CERT\"}]"

Где:

  • namespace — пространство имён, в котором установлено приложение ELMA365;
  • jwtTls.crt — имя файла TLS-сертификата;
  • jwtTls.key — имя файла ключа.
  1. Чтобы обновить данные о ключах, перезапустите под vahter с помощью команды:

kubectl rollout restart deployment vahter -n <namespace>

Где namespace — пространство имён, в котором установлено приложение ELMA365.

  1. В запланированную дата окончания перехода убедитесь, что сгенерированные на втором шаге TLS‑сертификат и ключ находятся в docker‑контейнере, и замените старые TLS‑сертификат и ключ на новые следующими командами:

 

BASE64_KEY=$(cat jwtTls.key | base64 -w 0) && kubectl patch secret vahter-jwt -n <namespace> --type='json' -p="[{\"op\": \"add\", \"path\": \"/data/tls.key\", \"value\": \"$BASE64_KEY\"}]"

 

BASE64_CERT=$(cat jwtTls.crt | base64 -w 0) && kubectl patch secret vahter-jwt -n <namespace> --type='json' -p="[{\"op\": \"add\", \"path\": \"/data/tls.crt\", \"value\": \"$BASE64_CERT\"}]"

Где:

  • namespace — пространство имён, в котором установлено приложение ELMA365;
  • jwtTls.crt — имя файла TLS-сертификата;
  • jwtTls.key — имя файла ключа.
  1. Удалите секреты промежуточного хранения ключей с помощью команд:

 

kubectl patch secret vahter-jwt -n <namespace> --type='json' -p='[{"op": "remove", "path": "/data/tls_new.crt"}]'

 

kubectl patch secret vahter-jwt -n <namespace> --type='json' -p='[{"op": "remove", "path": "/data/tls_new.key"}]' 

Где namespace — пространство имён, в котором установлено приложение ELMA365.