RE:NODE

Файлы bikey и проверка подписей в DayZ: как убрать кики из-за модов

Автор Команда RE:NODE
15 мин чтения


Если игрока DayZ выкидывает на экране загрузки с ошибкой подписи, почти всегда причина одна: один из загруженных им модов подписан ключом, которого нет в папке keys на сервере. Решение - скопировать файл .bikey из папки keys самого мода в папку keys сервера и перезапустить сервер, и делать это заново при каждом обновлении мода. Всё остальное в этом руководстве объясняет, почему это работает, как понять, какому моду не хватает ключа, почему серверным модам ключ не нужен и как не допустить устаревших ключей, чтобы проблема не возвращалась после каждого обновления в Workshop.

Эта статья посвящена только ключам и подписям. Установку сервера, порты и экономику лута смотрите в полном руководстве по серверу DayZ, а каждую строку конфигурации - в разборе serverDZ.cfg.

Что на самом деле проверяет верификация подписей#

Контент DayZ поставляется в файлах .pbo - упакованных архивах с моделями, текстурами, конфигами и скриптами - внутри папки addons мода. Рядом с каждым .pbo лежит файл .bisign: подпись, которую автор мода создал приватным ключом, никогда не покидающим его компьютер. Соответствующий публичный ключ - это .bikey, который автор кладёт в папку keys мода, чтобы серверы могли проверять подписи.

Когда игрок подключается к серверу с verifySignatures = 2, движок требует от клиента доказать, что каждый загруженный им .pbo имеет действительную подпись ключа, которому доверяет сервер. "Доверяет" означает только одно: файл .bikey с таким именем и содержимым лежит в папке keys сервера. Если у любого загруженного .pbo нет подписи, подпись повреждена или она сделана ключом, которого у сервера нет, игрока выкидывает.

Три файла, три задачи:

ФайлГде находитсяЧто это
.pbo@Mod/addons/Сам упакованный контент
.bisign@Mod/addons/, рядом с каждым .pboПодпись автора для одного конкретного .pbo
.bikey@Mod/keys/, затем копируется в keys/ сервераПубличный ключ для проверки этих подписей

Файл подписи называется по имени и .pbo, и ключа, которым он подписан, поэтому у автора мода с ключом MyMod получаются такие пары:

code
@MyMod/    addons/        mymod_core.pbo        mymod_core.pbo.MyMod.bisign        mymod_items.pbo        mymod_items.pbo.MyMod.bisign    keys/        MyMod.bikey    meta.cpp    mod.cpp

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

Стоит также чётко понимать, кто именно выкидывает игрока. Проверка подписей - часть игрового движка, она настраивается в serverDZ.cfg и работает независимо от того, запущен ли BattlEye. BattlEye - это отдельный слой античита, который следит за запущенными процессами и памятью. Игроки и многие руководства винят BattlEye в киках по подписи, потому что оба срабатывают в один и тот же момент подключения, но никакая настройка BattlEye не исправит отсутствующий ключ. Разницу между ними для разных игр объясняет статья BattlEye и Easy Anti-Cheat на серверах.

verifySignatures и связанные настройки#

Настройка - это одна строка в serverDZ.cfg:

serverDZ.cfg
verifySignatures = 2;allowFilePatching = 0;forceSameBuild = 1;

Документация Bohemia по DayZ называет 2 единственным поддерживаемым значением. В старых играх серии Arma был более слабый режим 1, который DayZ не использует, а 0 отключает проверку. Запуск с 0 иногда советуют на форумах как быстрое решение ошибок ключей. Кики он действительно прекращает - примерно так же, как снятие замка избавляет от потери ключа: теперь каждый клиент может загрузить любой изменённый файл, а ваш сервер спокойно примет игрока, у которого локальная копия мода переделана так, чтобы показывать лут сквозь стены. Оставьте 2 и исправьте ключ.

Две соседние настройки - часть той же картины:

  • allowFilePatching = 0 отклоняет клиентов, запущенных с параметром -filePatching, который позволяет игре загружать с диска отдельные распакованные файлы вместо подписанных .pbo. У таких файлов нет подписей, поэтому file patching - дыра прямо сквозь проверку подписей. Включать его есть смысл только разработчику модов при локальном тестировании.
  • forceSameBuild = 1 отклоняет клиентов с другой сборкой игры. Это проверка версии, а не подписи, но кики она вызывает в тот же момент, и после патча игры именно она часто оказывается настоящей причиной того, что игроки называют "опять эта история с подписью".

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

Папка keys#

Папка keys сервера находится в корне сервера, рядом с DayZServer_x64.exe в Windows или DayZServer в Linux и рядом с папками @Mod. В свежей установке в ней уже есть один файл:

code
keys/    dayz.bikey

dayz.bikey - собственный ключ Bohemia, которым подписаны файлы .pbo базовой игры. Никогда не удаляйте его. Без него каждый клиент не проходит проверку на ванильных данных, и к серверу невозможно подключиться, даже совсем без модов.

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

code
keys/    dayz.bikey    CF.bikey    Dabs.bikey    Expansion.bikey    VPPAdminTools.bikey    BuilderItems.bikey

Имена выбирает автор, поэтому они не всегда совпадают с названием папки мода. Мод @SomeWeaponsPack может поставляться с ключом SWP_v3.bikey. Один автор с несколькими модами часто подписывает их всеми одним ключом, а большой мод, разбитый на несколько элементов Workshop, например DayZ Expansion, может включать один и тот же ключ в каждую часть. Копировать ключ, который уже есть, безвредно - идентичный файл просто перезаписывается.

Некоторые моды кладут ключ в папку с названием Keys или key вместо keys. В Windows это не имеет значения. На сервере Linux пути чувствительны к регистру, поэтому скрипт, который ищет только в keys/, их пропустит. Ищите по расширению файла, а не по названию папки.

Установка ключа мода по шагам#

Для одного нового клиентского или клиентско-серверного мода порядок такой:

  1. Остановите сервер. Ключи и список модов читаются при запуске.
  2. Скачайте мод. В SteamCMD для этого нужен id клиентского приложения, 221100, а не серверного 223350. Файлы окажутся в steamapps/workshop/content/221100/<workshop id>/.
  3. Скопируйте или залинкуйте эту папку в корень сервера под понятным именем, например @SomeMod. Папки Workshop называются числами, а строка запуска, забитая числами, не поддаётся сопровождению.
  4. Скопируйте каждый .bikey из мода в папку keys сервера.
  5. Добавьте мод в -mod= с учётом зависимостей, сначала фреймворки.
  6. Запустите сервер и сами зайдите на него через DayZ Launcher, прежде чем кому-то говорить, что он работает.
bash
$ steamcmd +force_install_dir /home/dayz/server +login <steam_account> \    +workshop_download_item 221100 1559212036 +quit$ cd /home/dayz/server$ cp -r steamapps/workshop/content/221100/1559212036 @CF$ find @CF -iname '*.bikey' -exec cp -v {} keys/ \;

На сервере с большим числом модов копируйте все ключи за один проход, а не мод за модом. Из корня сервера в Linux:

bash
$ find . -maxdepth 3 -path './@*' -iname '*.bikey' -exec cp -v {} keys/ \;

В Windows, из папки сервера в PowerShell:

code
Get-ChildItem -Path .\@* -Recurse -Filter *.bikey | Copy-Item -Destination .\keys\

На панельном хостинге то же самое делается через файловый менеджер или SFTP: откройте папку @Mod/keys/ каждого мода, скопируйте файл и вставьте его в keys/ в корне сервера. На один мод уходит минута, и именно от этой минуты зависит, сможет ли кто-нибудь зайти. О подключении рассказывает статья SFTP и файловый менеджер, а если модов больше нескольких, быстрее загрузить за один раз все ключи из локальной копии модов в keys/, чем открывать каждую папку.

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

-mod и -serverMod: каким модам нужны ключи#

В DayZ есть два параметра запуска для модов, и разница между ними определяет, нужен ли ключ вообще:

ПараметрКем загружаетсяНужен ключ в keys/
-mod=Сервером и каждым клиентомДа, для каждого мода из списка
-serverMod=Только серверомНет
code
-mod=@CF;@Dabs Framework;@DayZ-Expansion-Core;@BuilderItems-serverMod=@MyServerTweaks;@LootLogger

Моды из -mod= сообщаются DayZ Launcher, который подписывает игроков на них и запускает игру с тем же списком. Каждый из этих модов загружается на клиенте, поэтому каждый проверяется, а значит, каждому нужен ключ на сервере.

Моды из -serverMod= никому не сообщаются и клиентами не загружаются. Раз их у клиентов нет, проверять нечего, и их ключи можно не класть в keys/. Типичные серверные моды - правки лута или экономики на уровне скриптов, инструменты логирования и серверная половина модов, у которых есть отдельный серверный пакет. Если автор говорит, что мод серверный, ему место здесь.

Ошибки бывают в обе стороны, и у каждой свой симптом:

  • Клиентский мод в `-serverMod=`. Сервер его загружает, игроки его не получают, и всё, что он добавляет, для них невидимо или работает неправильно: нет предметов, одежда отображается как текстура ошибки, не открываются меню. Кика по подписи нет, потому что клиент этот мод не загружает.
  • Серверный мод в `-mod=`. Каждого игрока заставляют его скачать, и если для него нет ключа в keys, выкидывает каждого. Некоторые серверные моды вообще не подписаны, потому что авторы не рассчитывали, что клиент будет их загружать, - и тогда ошибка превращается в гарантированный кик для всех.

Моды бывают и чисто клиентскими: правки интерфейса, наложения на карту, замена звуков, которые серверу запускать не нужно. Их нет ни в одном из параметров. Если вы хотите такой мод разрешить, положите его .bikey в keys/, и игроки с этим модом пройдут проверку. На тех, у кого его нет, это не повлияет. Это единственный правильный способ разрешить необязательный клиентский мод, и он же причина быть скупым: каждый лишний ключ расширяет то, что принимает сервер.

Обновление модов без блокировки всех игроков#

Большинство киков по подписи на давно работающих серверах случается в день обновления мода, и причина в расхождении между тем, что есть у сервера, и тем, что лаунчер выдаёт игрокам.

Когда мод в Workshop обновляется, подписанные на него игроки автоматически получают новую версию через Steam. Если на сервере всё ещё старая версия, может сломаться две вещи:

  • Автор подписал обновление новым ключом. Некоторые авторы создают новый ключ для каждого релиза или меняют ключ после смены версии. Новые файлы .bisign у клиента указывают на ключ, которого сервер никогда не видел. Каждого игрока с обновлением выкидывает, пока новый .bikey не скопирован в keys/.
  • Содержимое версий на сервере и у клиента различается. Даже при одинаковом ключе сервер со старой версией и клиенты с новой расходятся в классах и данных, что проявляется как кики, пропавшие предметы или вылеты при входе.

Порядок действий, который предотвращает обе проблемы:

  1. Остановите сервер.
  2. Обновите на сервере каждый мод до текущей версии в Workshop, а не только тот, о котором вы услышали. В SteamCMD для этого снова выполняется workshop_download_item для каждого id, с добавлением validate, если загрузка выглядит неполной.
  3. Скопируйте папки модов поверх старых в корне сервера.
  4. Снова скопируйте каждый .bikey из каждого мода командой для одного прохода, приведённой выше.
  5. Запустите сервер, просмотрите начало лога на предмет ошибок и сами зайдите через лаунчер.

Шаг 4 - привычка, которую стоит выработать: копируйте все ключи после любого обновления, считаете вы, что ключ изменился, или нет. Это занимает секунды и убирает самую частую причину, по которой сервер на весь вечер становится недоступным.

Старые ключи накапливаются по мере того, как авторы их меняют. Устаревший ключ не мешает подключению, но означает, что сервер по-прежнему доверяет подписям ключа, который автор мог вывести из обращения - в редких случаях потому, что он утёк. Раз или два в год очищайте папку до одного dayz.bikey, заново копируйте все актуальные ключи, и у вас останется ровно тот набор, который нужен.

Вторая половина - не обновляться в неподходящий момент. Патч игры DayZ может сломать моды, пока их авторы не пересоберут, а в день патча лаунчер выдаёт игрокам новые версии модов так быстро, как их публикуют авторы. Обновить сервер через несколько часов после авторов, когда список модов устоялся, лучше, чем в ту же минуту, когда вышел патч. Порядок отката описан в статье Что делать, если обновление мода всё сломало, а в статье Моды Steam Workshop на выделенных серверах объясняется, как загрузки из Workshop ведут себя на стороне сервера в разных играх.

.pbo, .bisign, .bikeyзагрузка лаунчеромадмин копирует .bikeyподключениеподписант в доверенных?Автор модаподписывает .pboSteam Workshop@Mod с keys/Игра игрокагрузит .pbo + .bisignСервер DayZverifySignatures 2Папка keys/файлы .bikey
Что происходит с подписанным модом при подключении игрока

Диагностика кика по подписи#

Сообщение о кике на экране игрока короткое, его формулировка менялась от версии к версии, но обычно в нём упоминается проверка подписи, изменённые данные или конкретный файл. Полезная деталь - имя файла, если оно показано: имя .pbo указывает прямо на мод, который не прошёл проверку.

Идите по этому порядку:

  1. Это у всех или у одного игрока? Если выкидывает всех, на сервере не хватает ключа или серверный мод попал в -mod=. Если выкидывает только одного, проблема в его локальных файлах.
  2. Прочитайте лог сервера. Кик записывается в файл .RPT и в консольный лог в папке профилей в момент, когда он происходит, обычно с именем игрока и файлом или причиной. Найдите имя игрока около времени его попытки зайти.
  3. Найдите мод. Сопоставьте имя .pbo с папкой мода: поищите этот файл во всех папках @Mod/addons/.
  4. Проверьте его ключ. Откройте папку keys этого мода, запомните имя .bikey и убедитесь, что такой же файл есть в keys/ сервера. Если файл с таким именем там есть, но мод недавно обновлялся, всё равно скопируйте его заново - изменённый ключ может сохранить прежнее имя.
  5. Проверьте версию. Сравните время последнего обновления мода в Workshop со временем обновления копии на сервере. Если в Workshop новее, обновите сервер.

Если проблема у одного игрока, исправлять нужно на его машине:

  • В DayZ Launcher откройте список модов, отпишитесь от проблемного мода и подпишитесь снова или воспользуйтесь функцией восстановления в лаунчере. Проверка через лаунчер, а не через свойства игры в Steam, гарантирует, что моды тоже будут проверены.
  • Убедитесь, что у него не запущена локальная изменённая копия мода и нет лишних клиентских модов, ключей которых у сервера нет. У игроков, которые играют на нескольких серверах, часто загружена куча модов, которые ваш сервер не запрашивал.
  • Если для другого сервера или руководства по моддингу они добавили в параметры запуска -filePatching, пусть уберут его.

Если ничего из этого не помогло, запустите сервер только с @CF или вообще без модов и зайдите. Если ванильный вариант работает, возвращайте моды группами, пока кик не появится снова. Это медленно, но всегда заканчивается конкретным названием.

Подпись собственных репаков#

Владельцы серверов иногда правят моды: меняют конфиг внутри .pbo, объединяют небольшие моды или меняют текстуру предмета. В тот момент, когда вы перепаковываете .pbo, его исходный .bisign перестаёт совпадать, и каждого клиента с вашей версией выкидывает. Решение - подписать самому, ради этого система и задумана.

В DayZ Tools, бесплатном в Steam, есть утилиты DS для этого: DSCreateKey создаёт пару ключей, а DSSignFile подписывает .pbo приватной половиной. Addon Builder из DayZ Tools тоже умеет подписывать при упаковке, если указать приватный ключ. Пара состоит из .biprivatekey, которым подписывают, и .bikey, который вы распространяете.

  • Положите свой .bikey в папку keys/ сервера и в папку keys/ своего репака.
  • Никогда не передавайте и не выкладывайте .biprivatekey. Любой, у кого он есть, может подписать файлы, которые ваш сервер примет.
  • Соблюдайте условия оригинального автора. Многие моды прямо запрещают перепаковку, а публикация чужой работы, заново подписанной вашим ключом, - верный способ добиться удаления элементов Workshop у серверов.

Для большинства серверов лучше вообще обойтись без перепаковки: меняйте поведение через файлы миссии, собственный конфиг мода в папке профилей или небольшой серверный мод в -serverMod=, которому ключ не нужен совсем. Насколько далеко можно зайти так с одним из самых крупных модов, показывает руководство по серверу DayZ Expansion.

Ключи на RE:NODE#

На сервере DayZ в RE:NODE папка keys и каждая папка @Mod доступны через файловый менеджер панели и по SFTP, с отдельными учётными данными для каждого сервера. Файловый менеджер распаковывает архивы на месте, поэтому мод, загруженный как zip, можно извлечь прямо в корень сервера, а затем скопировать его ключ. Список модов указывается в настройках запуска на вкладке Startup. Белого списка разрешённых модов нет - вы загружаете то, что выбрали, и сами выбираете, каким ключам доверять.

Перед обновлением мода сделайте backup из панели. Слоты backup есть в каждом тарифе DayZ, backup восстанавливается кнопкой, а восстановление предыдущего состояния - самый быстрый выход, если обновление пошло не так. Для самой установки DayZ нужен ваш собственный логин Steam, который вводится на вкладке Setup после создания сервера, как и у любого хостинга, который устанавливает DayZ за вас.

FAQ#

Куда класть файл .bikey в DayZ?

В папку keys в корне сервера, рядом с исполняемым файлом сервера и папками @Mod - не внутрь мода и не в папку профилей. Ключ каждого мода из -mod= должен лежать там. После добавления ключей перезапустите сервер.

Можно ли просто поставить verifySignatures в 0, чтобы убрать кики?

Можно, и кики прекратятся, но сервер перестанет отклонять изменённые файлы, так что любой игрок сможет загрузить отредактированный .pbo, который показывает лут сквозь стены или убирает отдачу. Исправление отсутствующего ключа занимает минуту и сохраняет защиту.

Нужен ли bikey серверным модам?

Нет. Моды, загружаемые через -serverMod=, клиенты не загружают, поэтому проверять по ним нечего. Ключи нужны только для того, что загружают клиенты: всё из -mod= и любой необязательный клиентский мод, который вы решили разрешить.

Почему сервер сломался после обновления мода, если больше ничего не менялось?

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

Почему выкидывает только одного игрока?

У него отличается локальная копия: повреждённая или устаревшая загрузка, отредактированный мод, лишний клиентский мод, для которого на вашем сервере нет ключа, или -filePatching в параметрах запуска. Пусть восстановит или заново подпишется на моды через DayZ Launcher.

Можно ли удалить dayz.bikey?

Нет. Это ключ для собственных файлов базовой игры. Без него каждый клиент не проходит проверку подписи на ванильных данных, и никто не может зайти, с модами или без.

Это было полезно?