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

Резервное копирование и перенос ключа

Приватный ключ контрибьютора существует только у него: он не хранится ни в репозитории, ни в CI/CD, ни у Lead Maintainer. Поэтому ответственность за сохранность ключа целиком лежит на его владельце. Утеря ключа без резервной копии — это организационная процедура отзыва и перерегистрации pgp_key_id в CONTRIBUTORS.json (ADR 0004), а для maintainer — еще и возможная задержка релиза (ADR 0005).

1. Что входит в резервную копию

АртефактКоманда полученияЗачем
Приватный ключ (первичный + подключи)gpg --export-secret-keys --armor KEYIDВосстановление возможности подписывать и расшифровывать
Публичный ключgpg --export --armor KEYIDУдобство восстановления (можно взять и из публикаций)
База доверия (ownertrust)gpg --export-ownertrustВосстановление уровней доверия к своему и чужим ключам
Сертификат отзывасоздан при генерации: ~/.gnupg/openpgp-revocs.d/<FPR>.revВозможность отозвать ключ при его утере

2. Создание резервной копии

# Приватный ключ (запросит passphrase)
gpg --export-secret-keys --armor 556B41333653BD5A > netgap-secret-key.asc

# Публичный ключ
gpg --export --armor 556B41333653BD5A > netgap-public-key.asc

# База доверия
gpg --export-ownertrust > netgap-ownertrust.txt

# Сертификат отзыва — просто скопируйте готовый файл
cp ~/.gnupg/openpgp-revocs.d/6B835E5BB72CBC2AA35F2E10556B41333653BD5A.rev .

Правила хранения:

  • носитель — офлайн и зашифрованный: аппаратно шифруемая флешка, зашифрованный образ (VeraCrypt, LUKS, зашифрованный DMG). Файл netgap-secret-key.asc защищен вашей passphrase, но не полагайтесь только на нее;
  • два экземпляра в разных местах (например, сейф дома и банковская ячейка / офисный сейф) — защита от пожара и утери носителя;
  • сертификат отзыва — отдельно от приватного ключа: тот, кто получит оба файла, сможет и подписываться от вашего имени, и отзывать ключ;
  • для долгосрочного хранения можно сделать бумажную копию (распечатка ASCII-armored файла или paperkey) — бумага не страдает от деградации носителей;
  • после записи на носитель удалите временные файлы с рабочей машины: shred -u netgap-secret-key.asc (macOS: rm -P);
  • обновляйте копию после изменений ключа (продление срока, новые подключи).
осторожно

Чего не делать никогда

Не коммитьте приватный ключ в репозитории (даже приватные), не храните его в облачных заметках и почте, не передавайте по мессенджерам. Резервная копия приватного ключа существует только на офлайн-носителях под вашим контролем.

3. Перенос ключа между своими машинами

Типовой сценарий: новая рабочая машина или необходимость подписывать коммиты и релизы с двух машин. Схема та же, что и у бекапа: экспорт → защищенная передача → импорт.

На старой машине

gpg --export-secret-keys --armor 556B41333653BD5A > transfer-secret.asc
gpg --export-ownertrust > transfer-ownertrust.txt

Передайте оба файла защищенным способом: зашифрованная флешка либо прямое копирование по SSH между своими машинами (scp transfer-secret.asc user@new-machine:~/). Не пересылайте через почту, мессенджеры и облачные диски.

На новой машине

# 1. Импорт приватного ключа (запросит passphrase)
gpg --import transfer-secret.asc

# 2. Импорт базы доверия
gpg --import-ownertrust transfer-ownertrust.txt

# 3. Если доверие не восстановилось — установить ultimate для своего ключа
gpg --edit-key 556B41333653BD5A
gpg> trust
# выберите: 5 = I trust ultimately
gpg> quit

# 4. Проверка: ключ на месте, secret-часть присутствует
gpg --list-secret-keys --keyid-format=long

Затем настройте git (Подпись коммитов) и сделайте пробную подпись:

echo test | gpg --clearsign > /dev/null && echo "OK: ключ работает"

Завершение

# Удалите временные файлы на обеих машинах
shred -u transfer-secret.asc transfer-ownertrust.txt # Linux
rm -P transfer-secret.asc transfer-ownertrust.txt # macOS

Если старая машина выводится из эксплуатации — удалите с нее приватный ключ:

gpg --delete-secret-keys 556B41333653BD5A
примечание

Альтернатива: перенос каталога ~/.gnupg целиком

Можно скопировать весь каталог ~/.gnupg (закрыв gpg-agent: gpgconf --kill gpg-agent). Это переносит и ключи, и доверие, и настройки, но также тянет кеши и служебные файлы. После копирования проверьте права: chmod 700 ~/.gnupg && chmod 600 ~/.gnupg/*. Способ с export/import чище и рекомендуется.

4. Восстановление из резервной копии

Процедура идентична «на новой машине»: gpg --import приватного ключа, gpg --import-ownertrust, при необходимости trust5, проверка gpg --list-secret-keys. Если восстановить ключ не удалось (носитель утрачен/поврежден):

  1. импортируйте сертификат отзыва и опубликуйте отозванный ключ (WKD, authors.yml, gpg.asc);
  2. сообщите Lead Maintainer — запись pgp_key_id в CONTRIBUTORS.json будет заменена;
  3. создайте новый ключ и пройдите регистрацию заново.

Чеклист: резервная копия

  • Экспортированы: приватный ключ, публичный ключ, ownertrust.
  • Скопирован сертификат отзыва из ~/.gnupg/openpgp-revocs.d/.
  • Копии записаны на два офлайн-носителя (зашифрованных), хранящихся раздельно.
  • Сертификат отзыва хранится отдельно от приватного ключа.
  • Временные файлы удалены с рабочей машины (shred -u / rm -P).
  • Восстановление проверено хотя бы один раз (тестовый импорт).

Чеклист: перенос на новую машину

  • Ключ и ownertrust экспортированы на старой машине.
  • Передача — только зашифрованный носитель или scp между своими машинами.
  • На новой машине: --import, --import-ownertrust, доверие ultimate.
  • gpg --list-secret-keys показывает ключ, пробная подпись работает.
  • git настроен (user.signingkey, commit.gpgsign), тестовый коммит подписан.
  • Временные файлы удалены на обеих машинах.
  • При выводе старой машины из эксплуатации приватный ключ с нее удален.