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