Ключ подписи и его смена
Всё, что лаунчер устанавливает, подписано вашим Ed25519-ключом: манифесты сборок и релизы самого лаунчера. Публичная часть ключа записывается в лаунчер при сборке, и лаунчер принимает только то, что подписано ключом из вашего списка.
Набор ключей
{ "build": { "signingKeyPath": "/var/lib/laminara/signing.key", "trustedSigningKeys": ["/var/lib/laminara/signing-next.key"] }}signingKeyPath — тот, которым подписывают сейчас. trustedSigningKeys — те, которые
лаунчер обязан принимать: будущий ключ, пока лаунчеры ещё обновляются, и старый, пока
среди игроков живут подписанные им сборки. Каждая запись — либо публичный ключ в hex, либо
путь к файлу ключа.
client-config кладёт в лаунчер весь набор, и лаунчер принимает документ, подписанный
любым ключом из него.
signing keys показать наборsigning new <путь> создать ключ (существующий не перезапишет)Порядок смены
Порядок здесь — и есть вся суть. Нарушите его, и лаунчеры у игроков перестанут принимать ваши подписи.
-
Создать ключ
signing new /var/lib/laminara/signing-next.key— новый ключ пока ничего не подписывает. -
Добавить его в доверенные
Вписать путь в
build.trustedSigningKeys, перезапустить сервер. Подписывает по-прежнему старый ключ. -
Выпустить новый лаунчер
client-config, затем пересборка, затемlauncher publish <версия>. Релиз подписан старым ключом, поэтому его принимают все текущие лаунчеры. После обновления лаунчеры знают оба ключа. -
Подождать
Пока игроки не получат этот релиз. Автообновление применяется при запуске, так что срок — это то, как часто заходят ваши игроки. Неделя-две для живого сервера.
-
Поменять местами
Новый ключ в
signingKeyPath, старый — вtrustedSigningKeys. Новые публикации идут новым ключом, старые сборки продолжают приниматься. -
Убрать старый
Сильно позже: убрать старый ключ из
trustedSigningKeys, снова пересобрать лаунчер и опубликовать. С этого момента подписи старым ключом не принимаются.
Если ключ утёк
Смена ключа не спасает от утечки. Она к утечке готовит.
У того, кто украл ваш ключ, есть ровно то же, что у вас: возможность подписать манифест и релиз лаунчера, которым доверяют все ваши игроки. Он может подписать «обновление» раньше, чем вы успеете что-то поменять. Шаги выше проходятся на этот раз только если вы быстрее вора.
Что реально делать при утечке:
- Немедленно остановить публичный слушатель — без него нечего раздавать.
- Пройти смену целиком, сократив шаг ожидания.
- Тем, кто не обновится, придётся переустановить лаунчер с вашего сайта.
- Сказать об этом игрокам прямо, а не тихо.
Единственная настоящая защита — чтобы ключ не утёк: держите его на сервере с правами
0600, не кладите в git, не носите в CI без секретного хранилища. Хранение подписывающего
ключа на машине сборки — самый частый способ его потерять.