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

Создание GPG-ключа и добавление его в проект

Эта статья проводит через полный путь: от установки GnuPG до момента, когда ваш ключ зарегистрирован в проекте и опубликован на сайте. Теоретические пояснения (устройство ключа, выбор алгоритма, идентификаторы) — в обзорной статье.

1. Установка GnuPG

# macOS
brew install gnupg

# Debian/Ubuntu
sudo apt install gnupg

# Проверка версии — требуется 2.1 или новее
gpg --version

2. Генерация ключа

Запустите интерактивную генерацию:

gpg --full-generate-key

Ответы на вопросы мастера:

ВопросРекомендуемый ответПояснение
Тип ключаECC (sign and encrypt)Создает первичный ключ ed25519 [SC] и подключ cv25519 [E] — покрывает и подпись, и шифрование
КриваяCurve 25519Обоснование выбора — в обзоре
Срок действия2y (или 1y)Страховка на случай утери ключа и сертификата отзыва; срок продлевается без замены ключа
ИмяВаши настоящие имя и фамилияДолжны соответствовать данным, под которыми вы проходили процесс контрибьютора (CAA)
EmailВаш рабочий email контрибьютораТот же email, что будет в CONTRIBUTORS.json и в git config user.email — CI сверяет их
Пароль (passphrase)Стойкая парольная фразаЗащищает приватный ключ на диске; обязательна
подсказка

Если нужен ключ RSA При жестких требованиях совместимости выберите RSA and RSA с длиной 4096 бит. Все остальные шаги статьи не меняются.

3. Проверка свойств созданного ключа

Посмотрите на созданный ключ в формате с длинными идентификаторами:

gpg --list-secret-keys --keyid-format=long

Пример вывода и как его читать:

sec ed25519/556B41333653BD5A 2026-07-26 [SC] [expires: 2028-07-26]
6B835E5BB72CBC2AA35F2E10556B41333653BD5A
uid [ultimate] Andrei Ganiushkin <andrey@ganyushkin.ru>
ssb cv25519/0123456789ABCDEF 2026-07-26 [E] [expires: 2028-07-26]
  • sec — приватная часть первичного ключа; ed25519/556B41333653BD5A — алгоритм и long key ID;
  • [SC] — флаги назначения: подпись (S) и сертификация (C); у подключа ssb флаг [E] — шифрование;
  • вторая строка — fingerprint (40 символов), главный идентификатор ключа;
  • [expires: ...] — срок действия;
  • uid — имя и email владельца; [ultimate] — уровень доверия к собственному ключу.

Полезные команды для получения идентификаторов:

# Fingerprint в привычной группировке по 4 символа
gpg --fingerprint andrey@ganyushkin.ru

# Только long key ID (последние 16 символов отпечатка)
gpg --list-keys --keyid-format=long andrey@ganyushkin.ru

Long key ID — это значение для поля pgp_key_id; полный fingerprint используется при сверке ключей людьми.

4. Экспорт публичного ключа

Публичный ключ экспортируется в текстовом (ASCII-armored) виде — его можно передавать по почте, класть в мессенджер или на сайт:

gpg --armor --export 556B41333653BD5A > my-public-key.asc

Файл начинается с -----BEGIN PGP PUBLIC KEY BLOCK-----. Приватный ключ (--export-secret-keys) никому не передается никогда — он нужен только вам, см. Резервное копирование.

5. Сертификат отзыва

GnuPG ≥ 2.1 создает сертификат отзыва автоматически при генерации ключа — в каталоге ~/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev. Если нужно создать заново:

gpg --output revoke-556B41333653BD5A.asc --gen-revoke 556B41333653BD5A

Сертификат отзыва позволяет объявить ключ недействительным даже без доступа к приватному ключу, поэтому:

  • храните его офлайн (зашифрованный носитель, распечатка в сейфе) отдельно от рабочей машины;
  • не храните его рядом с приватным ключом «просто в домашнем каталоге»: любой, кто получит этот файл, сможет отозвать ваш ключ.

Подробнее о хранении — в статье Резервное копирование и перенос ключа.

6. Регистрация ключа в проекте

Ключ становится «ключом контрибьютора Netgap» только после регистрации в реестре проекта:

  1. Передайте Lead Maintainer: полный fingerprint и файл публичного ключа (my-public-key.asc). Передача происходит в рамках процесса получения статуса контрибьютора (см. CONTRIBUTING.md); fingerprint дополнительно подтвердите по независимому каналу (голосовой звонок, личная встреча) — это защита от подмены ключа в момент передачи.
  2. Maintainer вносит запись в CONTRIBUTORS.json: email, role, permissions и pgp_key_id (long key ID). С этого момента CI начинает принимать ваши подписанные коммиты — см. Подпись и проверка коммитов.

7. Публикация ключа на сайте документации

Чтобы другие участники и пользователи могли легко получить ваш ключ (Где взять ключ участника), он публикуется на сайте netgap.io в трех местах.

7.1. Страница автора в блоге (blog/authors.yml)

Добавьте поля к своей записи автора:

pgp_key_id: "556B41333653BD5A" # Long key ID (последние 16 символов отпечатка)
pgp_public_key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
... (содержимое my-public-key.asc) ...
socials:
gpg: true # Включает иконку GPG со ссылкой на ключ

Ключ будет отображаться на странице автора (/blog/authors/<имя_автора>).

7.2. WKD (Web Key Directory)

WKD позволяет почтовым клиентам и gpg --locate-keys автоматически находить ключ по email через https://netgap.io/.well-known/openpgpkey/....

внимание

Ограничение WKD WKD работает, только если домен email в UID ключа совпадает с доменом, на котором опубликован WKD-каталог. Для ключа на user@gmail.com WKD на netgap.io работать не будет — такой ключ распространяется через authors.yml и CONTRIBUTORS.json.

  1. Получите WKD-хеш локальной части вашего email:

    gpg --with-wkd-hash --list-keys user@example.com

    В выводе под UID появится строка вида 9wiowa5q4dryaf1g3wsnhhzzw7cmek45@example.com — часть до @ и есть хеш.

  2. Экспортируйте ключ в бинарном виде (WKD не принимает ASCII-armored):

    gpg --export 556B41333653BD5A > static/.well-known/openpgpkey/hu/ВАШ_ХЕШ
  3. Убедитесь, что в static/.well-known/openpgpkey/ присутствует пустой файл policy (он уже создан в репозитории).

Типичные ошибки: текстовый (-----BEGIN PGP...) файл вместо бинарного в каталоге hu/; сайт без HTTPS (WKD работает только по HTTPS).

7.3. Общий файл static/gpg.asc (только для основного ключа maintainer)

В корне сайта лежит файл прямой загрузки ключа Lead Maintainer. При обновлении основного ключа не забудьте обновить и его:

gpg --armor --export 556B41333653BD5A > static/gpg.asc

8. Обслуживание ключа

  • Продление срока действия (до истечения expiration):

    gpg --edit-key 556B41333653BD5A
    gpg> expire # задать новый срок первичному ключу
    gpg> key 1 # выбрать подключ шифрования
    gpg> expire # продлить и его
    gpg> save

    После продления переопубликуйте публичный ключ (раздел 7) — иначе у остальных ключ «истечет».

  • Компрометация или утеря: немедленно сообщите Lead Maintainer, импортируйте и распространите сертификат отзыва (gpg --import revoke.asc, затем переопубликуйте ключ), создайте новый ключ и пройдите регистрацию заново — pgp_key_id в CONTRIBUTORS.json будет заменен.

Чеклист: ключ создан и добавлен в проект

  • GnuPG ≥ 2.1 установлен.
  • Ключ создан: ECC (sign and encrypt), Curve 25519, срок 1–2 года, стойкая passphrase.
  • Email в UID ключа совпадает с email контрибьютора (и будущим git config user.email).
  • Свойства ключа проверены: алгоритм, флаги [SC]/[E], срок действия (gpg --list-secret-keys --keyid-format=long).
  • Выписаны fingerprint (40 символов) и long key ID (16 символов).
  • Публичный ключ экспортирован в my-public-key.asc.
  • Сертификат отзыва сохранен офлайн, отдельно от приватного ключа.
  • Fingerprint и публичный ключ переданы Lead Maintainer, fingerprint подтвержден по независимому каналу.
  • pgp_key_id внесен в CONTRIBUTORS.json.
  • Ключ опубликован: blog/authors.yml; WKD (если email на домене сайта); static/gpg.asc (для основного ключа maintainer).
  • Сделана резервная копия приватного ключа — Резервное копирование.