Перейти к содержимому

Ключ подписи и его смена

Всё, что лаунчер устанавливает, подписано вашим Ed25519-ключом: манифесты сборок и релизы самого лаунчера. Публичная часть ключа записывается в лаунчер при сборке, и лаунчер принимает только то, что подписано ключом из вашего списка.

Набор ключей

{
"build": {
"signingKeyPath": "/var/lib/laminara/signing.key",
"trustedSigningKeys": ["/var/lib/laminara/signing-next.key"]
}
}

signingKeyPath — тот, которым подписывают сейчас. trustedSigningKeys — те, которые лаунчер обязан принимать: будущий ключ, пока лаунчеры ещё обновляются, и старый, пока среди игроков живут подписанные им сборки. Каждая запись — либо публичный ключ в hex, либо путь к файлу ключа.

client-config кладёт в лаунчер весь набор, и лаунчер принимает документ, подписанный любым ключом из него.

signing keys показать набор
signing new <путь> создать ключ (существующий не перезапишет)

Порядок смены

Порядок здесь — и есть вся суть. Нарушите его, и лаунчеры у игроков перестанут принимать ваши подписи.

  1. Создать ключ

    signing new /var/lib/laminara/signing-next.key — новый ключ пока ничего не подписывает.

  2. Добавить его в доверенные

    Вписать путь в build.trustedSigningKeys, перезапустить сервер. Подписывает по-прежнему старый ключ.

  3. Выпустить новый лаунчер

    client-config, затем пересборка, затем launcher publish <версия>. Релиз подписан старым ключом, поэтому его принимают все текущие лаунчеры. После обновления лаунчеры знают оба ключа.

  4. Подождать

    Пока игроки не получат этот релиз. Автообновление применяется при запуске, так что срок — это то, как часто заходят ваши игроки. Неделя-две для живого сервера.

  5. Поменять местами

    Новый ключ в signingKeyPath, старый — в trustedSigningKeys. Новые публикации идут новым ключом, старые сборки продолжают приниматься.

  6. Убрать старый

    Сильно позже: убрать старый ключ из trustedSigningKeys, снова пересобрать лаунчер и опубликовать. С этого момента подписи старым ключом не принимаются.

Если ключ утёк

Смена ключа не спасает от утечки. Она к утечке готовит.

У того, кто украл ваш ключ, есть ровно то же, что у вас: возможность подписать манифест и релиз лаунчера, которым доверяют все ваши игроки. Он может подписать «обновление» раньше, чем вы успеете что-то поменять. Шаги выше проходятся на этот раз только если вы быстрее вора.

Что реально делать при утечке:

  1. Немедленно остановить публичный слушатель — без него нечего раздавать.
  2. Пройти смену целиком, сократив шаг ожидания.
  3. Тем, кто не обновится, придётся переустановить лаунчер с вашего сайта.
  4. Сказать об этом игрокам прямо, а не тихо.

Единственная настоящая защита — чтобы ключ не утёк: держите его на сервере с правами 0600, не кладите в git, не носите в CI без секретного хранилища. Хранение подписывающего ключа на машине сборки — самый частый способ его потерять.