Создание 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, что будет в 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» только после регистрации в реестре проекта:
- Передайте Lead Maintainer: полный fingerprint и файл публичного ключа (
my-public-key.asc). Передача происходит в рамках процесса получения статуса контрибьютора (см. CONTRIBUTING.md); fingerprint дополнительно подтвердите по независимому каналу (голосовой звонок, личная встреча) — это защита от подмены ключа в момент передачи. - 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.
-
Получите WKD-хеш локальной части вашего email:
gpg --with-wkd-hash --list-keys user@example.comВ выводе под UID появится строка вида
9wiowa5q4dryaf1g3wsnhhzzw7cmek45@example.com— часть до@и есть хеш. -
Экспортируйте ключ в бинарном виде (WKD не принимает ASCII-armored):
gpg --export 556B41333653BD5A > static/.well-known/openpgpkey/hu/ВАШ_ХЕШ -
Убедитесь, что в
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 556B41333653BD5Agpg> 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). - Сделана резервная копия приватного ключа — Резервное копирование.