|
|
|
|
@@ -0,0 +1,151 @@
|
|
|
|
|
# GPG подпись
|
|
|
|
|
|
|
|
|
|
<!-- https://www.youtube.com/watch?v=2CwsoGw2coc -->
|
|
|
|
|
<!-- https://docs.github.com/en/authentication/managing-commit-signature-verification/generating-a-new-gpg-key -->
|
|
|
|
|
|
|
|
|
|
GPG ключи по сравнению с SSH ключами имеют более развитый функционал.
|
|
|
|
|
- настройка специализации ключа (шифрование, подпись, авторизация, создание подключей);
|
|
|
|
|
- отзыв ранее выпущенных ключей;
|
|
|
|
|
- настройка срока действия ключей с возможностью продления в будущем;
|
|
|
|
|
- привязка ключей к имени пользователя и почте;
|
|
|
|
|
- возможность загрузки публичных ключей на сервера ключей;
|
|
|
|
|
|
|
|
|
|
Под Windows утилита gpg идет вместе с git. Так что можно работать сразу после установки git.
|
|
|
|
|
|
|
|
|
|
Все свои файлы gpg хранит в `~/.gnupg/`
|
|
|
|
|
|
|
|
|
|
Полезно добавить в конфиг:
|
|
|
|
|
```
|
|
|
|
|
cat << --- >> ~/.gnupg/gpg.conf
|
|
|
|
|
keyid-format LONG
|
|
|
|
|
with-fingerprint
|
|
|
|
|
no-greeting
|
|
|
|
|
armor
|
|
|
|
|
---
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Полезные команды:
|
|
|
|
|
```
|
|
|
|
|
gpg -k --keyid-format=long # Посмотреть публичные ключи
|
|
|
|
|
gpg -K --keyid-format=long # Посмотреть приватные ключи
|
|
|
|
|
gpg --full-generate-key # Генерация пары ключей
|
|
|
|
|
gpg -a --export <key-id> # Экспорт публичного ключа
|
|
|
|
|
gpg -a --export-secret-keys <key-id> # Экспорт секретного ключа
|
|
|
|
|
gpg --import <file> # Импорт ключа
|
|
|
|
|
gpg --delete-key <key-id> # Удаление публичного ключа
|
|
|
|
|
gpg --delete-secrete-key <key-id> # Удаление секретного ключа
|
|
|
|
|
git config --global user.signingkey <key-id>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Обозначения типов ключей:
|
|
|
|
|
```
|
|
|
|
|
sec - secret primary key (секретный основной ключ)
|
|
|
|
|
pub - public primary key (публичный основной ключ)
|
|
|
|
|
ssb - secret sub-key (секретный сабключ)
|
|
|
|
|
sub - public sub-key (публичный сабключ)
|
|
|
|
|
> - ключ есть на карте
|
|
|
|
|
# - нет секретного ключа, только заглушка для сабключа
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Генерация ключей
|
|
|
|
|
|
|
|
|
|
Создаем основной (primary) ключ:
|
|
|
|
|
```
|
|
|
|
|
gpg --expert --full-generate-key
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Выбираем один из вариантов:
|
|
|
|
|
```
|
|
|
|
|
RSA (sign only) # создание только основного ключа c правами [SC]
|
|
|
|
|
RSA (set your own capabilities) # создание только основного ключа c настраиваемыми правами
|
|
|
|
|
```
|
|
|
|
|
Этот ключ нужен для генерации других сабключей.
|
|
|
|
|
|
|
|
|
|
## Генерация сабключей
|
|
|
|
|
|
|
|
|
|
Для генерации сабключей заходим в консоль gpg:
|
|
|
|
|
```
|
|
|
|
|
gpg --expert --edit-key [id]
|
|
|
|
|
> addkey
|
|
|
|
|
...
|
|
|
|
|
> save
|
|
|
|
|
```
|
|
|
|
|
`[id]` - здесь и далее в качестве id можно использовать id ключа, имя или почту пользователя.
|
|
|
|
|
`?` - список все комманд
|
|
|
|
|
`addkey` - добавить новый сабключ
|
|
|
|
|
`change-usage` - поменять флаги usage
|
|
|
|
|
`save` - не забываем сохранить результаты перед выходом
|
|
|
|
|
|
|
|
|
|
## Экспорт ключей
|
|
|
|
|
|
|
|
|
|
Прежде удалять мастер ключ или переносить сабключи на карту, необходимо сделать бекап (экспорт) всей нашей работы.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
gpg -a --export-secret-key [id] > master.key # Экспорт основного ключа
|
|
|
|
|
gpg -a --export-secret-subkeys [id] > subkeys.key # Экспорт сабключей
|
|
|
|
|
gpg -a --export [id] public.key # Экспорт публичных ключей
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Сохранение на аппаратный ключ
|
|
|
|
|
<!-- https://fido.ftsafe.com/openpgp/ -->
|
|
|
|
|
<!-- https://rgoulter.com/blog/posts/programming/2022-06-10-a-visual-explanation-of-gpg-subkeys.html -->
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
gpg --card-status # посмотреть информацию по карте
|
|
|
|
|
gpg --edit-key [id] # входим в режим редактирования
|
|
|
|
|
> key 1 # выбираем первый сабключ
|
|
|
|
|
> keytocard # переносим его на карту
|
|
|
|
|
> key 1 # снимаем старый выбор
|
|
|
|
|
> key 2 # выбираем следующий сабключ
|
|
|
|
|
> keytocard # переносим его на карту
|
|
|
|
|
> key 2 # снимаем старый выбор
|
|
|
|
|
> key 3 # выбираем следующий сабключ
|
|
|
|
|
> keytocard # переносим его на карту
|
|
|
|
|
> key 3 # снимаем старый выбор
|
|
|
|
|
> save # сохраняем (локальные ключи сотрутся!)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Удаление секретных ключей
|
|
|
|
|
|
|
|
|
|
Удалем секретный ключ:
|
|
|
|
|
```
|
|
|
|
|
gpg --delete-secret-keys [id]
|
|
|
|
|
```
|
|
|
|
|
Удалятся все секретные ключи. Для того чтобы gpg понял что секретные ключи находятся на карте выполняем:
|
|
|
|
|
```
|
|
|
|
|
gpg --card-status
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Для использования карты на новом компьютере достаточно импортировать public ключ и запустить `gpg --card-status`.
|
|
|
|
|
|
|
|
|
|
## Загрузка public ключа на сервер ключей
|
|
|
|
|
|
|
|
|
|
Существует огромное кол-во серверов ключей, для примера будем использовать:
|
|
|
|
|
|
|
|
|
|
https://keys.openpgp.org/
|
|
|
|
|
|
|
|
|
|
Ключи лучше загружать через web-интерфес чтобы получить ссылку для верификации почты.
|
|
|
|
|
|
|
|
|
|
После того как public ключ загружен на сервер, можно добавить URL ключа в настройки карты. Тогда будет возможно настравить новый компьютер совсем просто:
|
|
|
|
|
```
|
|
|
|
|
gpg --card-edit # Заходим в настройки карты
|
|
|
|
|
> fetch # Скачиваем public ключ
|
|
|
|
|
> quit # Выходим
|
|
|
|
|
gpg --edit-key [id] # Заходим в редактирование
|
|
|
|
|
> trust # Редактируем trust (по умолчанию она сброшена в "unknown")
|
|
|
|
|
> 5 # Савим "ultimate" (Это наш собственный ключ, доверяем.)
|
|
|
|
|
> save # Сохраняем
|
|
|
|
|
```
|
|
|
|
|
И сразу можно подписывать коммиты :)
|
|
|
|
|
|
|
|
|
|
## Настройка подписи коммитов в git
|
|
|
|
|
|
|
|
|
|
Подписать последний коммит `git commit --amend --no-edit -S`
|
|
|
|
|
|
|
|
|
|
Также не лишним будет добавить удобные элиасы в .ginconfig:
|
|
|
|
|
```
|
|
|
|
|
sign = commit --amend --no-edit -S
|
|
|
|
|
unsign = commit --amend --no-edit
|
|
|
|
|
signoff = commit --amend --no-edit -s
|
|
|
|
|
```
|