Files
state-corp-backend/docs/exchange-key-rotation.md
Aleksandr Meshchryakov 78412f9e3b
All checks were successful
State Corp Backend CI/CD / Quality gate (push) Successful in 3m19s
State Corp Backend CI/CD / Build linux/amd64 images once (push) Successful in 2m54s
State Corp Backend CI/CD / Refresh and release internal main (push) Has been skipped
State Corp Backend CI/CD / Release customer main (push) Has been skipped
State Corp Backend CI/CD / Release dev (push) Successful in 54s
fix(exchange): preserve old archives during server key rotation
2026-09-14 00:04:53 +02:00

3.6 KiB
Raw Blame History

Ротация ключа обмена

EXCHANGE_SHARED_TOKEN служит текущим ключом HTTP-доступа к загрузке и материалом ключа шифрования пакетов. Его нельзя передавать frontend или публиковать в runtime-config.js. Публичный маркер браузерной загрузки требует отдельной серверной проверки JWT активного администратора; сам по себе он доступа не даёт.

При согласованной ротации Мостовик и State Corp получают новый общий ключ и новый EXCHANGE_KEY_ID (у Мостовика — STATE_CORP_EXCHANGE_KEY_ID). Чтобы ранее подготовленные архивы оставались доступны, State Corp может хранить одну прежнюю пару только на сервере:

  • EXCHANGE_PREVIOUS_SHARED_TOKEN — прежний ключ расшифровки;
  • EXCHANGE_PREVIOUS_KEY_ID — точный key_id прежних пакетов.

Оба предыдущих параметра задаются вместе, предыдущий ID должен отличаться от текущего. Неполная или неоднозначная конфигурация отклоняет импорт. Старый ключ выбирается только для точного предыдущего key_id; перебора ключей при ошибке расшифровки нет. При пустых предыдущих параметрах сохраняется прежнее поведение с единственным текущим ключом, в том числе для контейнеров без key_id.

HTTP-загрузка всегда проверяет только текущий EXCHANGE_SHARED_TOKEN. Предыдущий ключ не предоставляет доступа к API. При загрузке старого архива с текущими правами действуют прежние правила проверки, атомарного импорта и распознавания дубликатов; миграции и преобразование предметных записей не нужны.

Порядок применения: убрать секрет из браузерной конфигурации, дождаться окончания активных задач отправителя, приватно сохранить текущую конфигурацию, установить предыдущую пару у получателя и новую текущую пару у обоих участников, пересоздать соответствующие процессы. Проверить отказ старого HTTP-ключа, загрузку текущим ключом старого и нового архивов, а также повтор без изменения предметных данных. Прежний ключ удаляют после согласованного срока хранения старых архивов; после удаления такие архивы перестанут расшифровываться автоматически.

Проверки: uv run pytest tests/apps/exchange/. Настройки, ключи и старые архивы не должны попадать в репозиторий, логи или публичные файлы.