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

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

Всё, что лаунчер устанавливает, подписано вашим 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 без секретного хранилища. Хранение подписывающего ключа на машине сборки — самый частый способ его потерять.