﻿# Обновление ключей для JWT-токенов

> [HTML Version](jwt-token-update.html)

В ELMA365 при аутентификации пользователей применяются JWT‑токены (JSON Web Token). Они автоматически выдаются сотрудникам после успешного ввода логина и пароля и используются для их авторизации при обращении к системе.

Для проверки актуальности выданных токенов применяются TLS‑сертификат и ключ. Они генерируются автоматически при установке системы. Для повышения безопасности рекомендуется регулярно обновлять эти ключи — не реже одного раза в год. 

Чтобы минимизировать влияния этого процесса на работу пользователей, в ELMA365 можно настроить плавный переход на обновлённые ключи. Для этого нужно:



1. Создать новые TLS‑сертификат и ключ для проверки JWT‑токена пользователя и сохранить их в секретах сервиса **vahter**. 

2. Определить дату удаления старого TLS‑сертификата и ключа для JWT‑токена.

3. Пока старый TLS‑сертификат и ключ остаются активными, заверенные ими JWT‑токены обновятся автоматически, когда пользователь совершит какое‑либо действие в системе.

4. Если в процессе смены ключей пользователь не работает в системе, при следующем входе ему нужно повторно ввести логин и пароль, чтобы получить JWT‑токен, проверенный новым ключом. 



Настройка обновления TLS‑сертификата и ключа для JWT‑токенов отличается в зависимости от способа установки системы:

- [установка в Kubernetes](#helm) — параметры задаются в файле \[OBJECT\];

- [установка в Kubernetes‑in‑Docker (KinD)](#kind) — используются команды в интерфейсе Docker.



## Обновление ключей JWT‑токенов для ELMA365 в Kubernetes

Для вариантов установки [ELMA365 On‑Premises Standard Kubernetes](install-elma365-standard-kubernetes.md) и [ELMA365 On‑Premises Enterprise](installing-elma365-enterprise.md) выполните шаги:

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

````
Где:

- \[OBJECT\] — срок действия TLS-сертификата в днях; 

- \[OBJECT\] — домен компании;

- \[OBJECT\] — имя файла TLS‑сертификата;

- \[OBJECT\] — имя файла ключа.

2. Откройте файл \[OBJECT\] и в блоке **Настройка микросервиса vahter** включите параметр \[OBJECT\], установив значение \[OBJECT\]:

````
vahter:  
  secrets:  
    renewToken:  
      enabled: true

3. ````
Настройте параметры обновления 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-----

````
Где: 

- \[OBJECT\] — установите расписание, по которому будут выполняться автоматический запуск cronjob и замена старых ключей. Для примера указан запуск каждый час, каждый день.  
  
cronjob — это инструмент в Kubernetes, который позволяет задать расписание повторяющейся операции. Подробнее о правилах настройки cronjob читайте на [официальном сайте Kubernetes](https://kubernetes.io/ru/docs/concepts/workloads/controllers/cron-jobs/ );

- \[OBJECT\] — дата, когда пользователи со старыми JWT‑токенами больше не смогут войти в систему. Для примера указано: \[OBJECT\];

- \[OBJECT\] — укажите TLS-сертификат, скопировав содержимое файла \[OBJECT\], который вы получили на первом шаге;

- \[OBJECT\] — укажите ключ, скопировав содержимое файла \[OBJECT\], который вы получили на первом шаге.

4. Выполните обновление сервисов системы при помощи команды: 

````
helm upgrade elma365 elma365/elma365 values-elma365.yaml

````
После обновления новый TLS‑сертификат и ключ запишутся в секреты сервиса **vahter**. Когда наступит дата, указанная в параметре \[OBJECT\], старый TLS‑сертификат и ключ для JWT токенов удалятся.

5. Для повышения безопасности удалите введённые на шаге три данные TLS‑сертификата и ключа из файла конфигурации \[OBJECT\] либо ограничьте доступ к этому файлу.

## Обновление ключей JWT-токенов для ELMA365 в KinD

Для варианта установки [ELMA365 On-Premises Standard в KinD](install-kubernetes-in-docker.md) выполните шаги:

1. Чтобы настроить обновление ключей JWT‑токенов, перейдите в docker‑контейнер приложения ELMA365 с помощью команды: 

````
docker exec -it elma365 /bin/bash

````
Где \[OBJECT\] — имя docker-контейнера.

2. Получите 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

````
Где:

- \[OBJECT\] — срок действия TLS-сертификата в днях; 

- \[OBJECT\] — домен компании;

- \[OBJECT\] — имя файла TLS-сертификата;

- \[OBJECT\] — имя файла ключа.

3. Для процесса замены 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\\"\}\]"

````
Где:

- \[OBJECT\] — пространство имён, в котором установлено приложение ELMA365;

- \[OBJECT\] — имя файла TLS-сертификата;

- \[OBJECT\] — имя файла ключа.

4. Чтобы обновить данные о ключах, перезапустите под **vahter** с помощью команды:

````
kubectl rollout restart deployment vahter -n <namespace>

````
Где \[OBJECT\] — пространство имён, в котором установлено приложение ELMA365.

5. В запланированную дата окончания перехода убедитесь, что сгенерированные на втором шаге 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\\"\}\]"

````
Где:

- \[OBJECT\] — пространство имён, в котором установлено приложение ELMA365;

- \[OBJECT\] — имя файла TLS-сертификата;

- \[OBJECT\] — имя файла ключа.

6. Удалите секреты промежуточного хранения ключей с помощью команд:



````
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"\}\]' 

````
Где \[OBJECT\] — пространство имён, в котором установлено приложение ELMA365.

