Compare commits
8 Commits
65bf081e65
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
50f9049c98
|
|||
|
f0d89afee8
|
|||
|
d91bdd1fc0
|
|||
| 6c10f518ce | |||
|
5e31fe1262
|
|||
|
fd6b41cf76
|
|||
| 43bbdb0f42 | |||
| f7c70c43a0 |
@@ -4,6 +4,8 @@
|
||||
* [Установка GIT в windows](src/GIT-install-win.md)
|
||||
* [Конфигурация GIT](src/GIT-config.md)
|
||||
* [SSH авторизация по ключам](src/SSH-key-auth-win.md)
|
||||
* [SSH подпись](src/GIT-SSH-sign.md)
|
||||
* [GPG подпись](src/GIT-GPG-sign.md)
|
||||
* [Установка TortoiseGit](src/TortoiseGit.md)
|
||||
* [GIT в Bash](src/GIT-Bash.md)
|
||||
* [VS Code](src/VS-Code.md)
|
||||
|
||||
216
src/GIT-GPG-sign.md
Normal file
216
src/GIT-GPG-sign.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# 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 ключами имеют более развитый функционал.
|
||||
- настройка специализации ключа (шифрование, подпись, авторизация, создание подключей);
|
||||
- отзыв ранее выпущенных ключей;
|
||||
- настройка срока действия ключей с возможностью продления в будущем;
|
||||
- привязка ключей к имени пользователя и почте;
|
||||
- возможность загрузки публичных ключей на сервера ключей;
|
||||
- возможность хранения секретных ключей на аппаратном ключе который поддерживает стандарт OpenPGP Card (например Yubikey)
|
||||
|
||||
Под 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 [master-key-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
|
||||
```
|
||||
|
||||
## Настройка чистой системы для подписи аппаратным ключом
|
||||
|
||||
Если есть аппаратный ключ и нужно настроить подпись коммитов на чистой системе,
|
||||
то можно просто импортировать публичные ключи с карты.
|
||||
Предполагается что `.gitconfig` настроен правильно.
|
||||
|
||||
Предварительно можно очистить все настройки `gpg` удалив папку `~/.gpgconf`
|
||||
|
||||
Если удалить не получается то надо убить процессы:
|
||||
```
|
||||
gpgconf --kill all
|
||||
```
|
||||
|
||||
Импортируем ключи с карты:
|
||||
```
|
||||
gpg --card-edit
|
||||
> fetch
|
||||
> quit
|
||||
```
|
||||
|
||||
Опционально устанавливаем ключу максимальный уровень доверия:
|
||||
```
|
||||
gpg --edit-key [id]
|
||||
> trust
|
||||
5
|
||||
> quit
|
||||
```
|
||||
|
||||
## Продление ключей
|
||||
|
||||
Короткий вариант продлить сразу все ключи:
|
||||
```
|
||||
gpg --import ~/master.key # временно импортируем мастер ключ
|
||||
gpg --quick-set-expire [master-key-fingerprint] 1y '*' # продляем на 1 год с текущей даты
|
||||
gpg --quick-set-expire [master-key-fingerprint] 2025-12-31 '*' # или указываем конкретную дату
|
||||
gpg --delete-secret-keys [master-key-id] # удаляем секретные ключи
|
||||
gpg --keyserver keys.openpgp.org --send-keys [master-key-id] # обновляем на сервере
|
||||
gpg -a --export [master-key-id] > public.key # экспорт публичных ключей
|
||||
# обновляем public.key на всех серверах git
|
||||
```
|
||||
|
||||
Или вручную по одному:
|
||||
```
|
||||
gpg --import ~/master.key # временно импортируем мастер ключ
|
||||
gpg --edit-key [master-key-id]
|
||||
> key 1 # выбираем первый сабключ
|
||||
> expire # редактируем срок действия
|
||||
> 1y # 1 год например
|
||||
> key 1 # снимаем старый выбор
|
||||
> key 2 # выбираем следующий сабключ
|
||||
> expire # редактируем срок действия
|
||||
> 1y # 1 год например
|
||||
> key 2 # снимаем старый выбор
|
||||
> key 3 # выбираем следующий сабключ
|
||||
> expire # редактируем срок действия
|
||||
> 1y # 1 год например
|
||||
> key 3 # снимаем старый выбор
|
||||
> save # сохраняем (локальные ключи сотрутся!)
|
||||
gpg --delete-secret-keys [master-key-id] # удаляем секретные ключи
|
||||
gpg --keyserver keys.openpgp.org --send-keys [master-key-id] # обновляем на сервере
|
||||
gpg -a --export [master-key-id] > public.key # экспорт публичных ключей
|
||||
# обновляем public.key на всех серверах git
|
||||
```
|
||||
Обновлять приватные ключи на аппаратных ключах (Yubikey) не нужно, т.к. там храниться только криптографическая часть, без метаданных.
|
||||
56
src/GIT-SSH-sign.md
Normal file
56
src/GIT-SSH-sign.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# SSH подпись
|
||||
|
||||
Как мы знаем в GIT можно указать любое имя пользователя и почтовый адрес.
|
||||
|
||||
Для достоверной идентификации автора существует возможность цифровой подписи коммитов.
|
||||
|
||||
Подписывать коммиты будем тем же самым ключом SSH который мы использовали ранее для работы с удаленными репозиториями.
|
||||
|
||||
<!-- https://dev.to/ccoveille/git-the-complete-guide-to-sign-your-commits-with-an-ssh-key-35bg -->
|
||||
<!-- https://developer.1password.com/docs/ssh/git-commit-signing/ -->
|
||||
|
||||
|
||||
Чтобы верифицировать подписи локально, нужно создать файл с доверенными ключами...
|
||||
|
||||
```
|
||||
echo "$(git config --get user.name) $(cat ~/.ssh/id_rsa.pub)" >> ~/.ssh/allowed_signers
|
||||
```
|
||||
|
||||
|
||||
Добавляем соответствующие настройки в GIT:
|
||||
```
|
||||
git config --global gpg.format ssh # Включаем SSH для подписи
|
||||
git config --global user.signingkey "~/.ssh/id_rsa.pub" # Добавляем открытый ключ
|
||||
git config --global gpg.ssh.allowedSignersFile "~/.ssh/allowed_signers" # Добавляем файл доверенных подписей
|
||||
git config --global commit.gpgsign true # Автоподпись для коммитов
|
||||
git config --global tag.gpgsign true # Автоподпись для тэгов
|
||||
```
|
||||
|
||||
Таким образом мой файл .gitconfig теперь выглядит так:
|
||||
```
|
||||
[user]
|
||||
name = ARNik
|
||||
email = r.anikeev@gmail.com
|
||||
signingkey = ~/.ssh/id_rsa.pub
|
||||
[color]
|
||||
ui = true
|
||||
[core]
|
||||
quotepath = off # отображение русских имен файлов
|
||||
[alias]
|
||||
ll = log --oneline --graph --decorate --all
|
||||
st = status --short
|
||||
co = checkout
|
||||
br = branch
|
||||
ct = commit
|
||||
|
||||
lg = log --graph --all\
|
||||
--pretty=format:'%Cred%h%Creset -%C(auto)%d %Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
|
||||
[gpg]
|
||||
format = ssh
|
||||
[gpg "ssh"]
|
||||
allowedSignersFile = ~/.ssh/allowed_signers
|
||||
[commit]
|
||||
gpgsign = true
|
||||
[tag]
|
||||
gpgsign = true
|
||||
```
|
||||
@@ -20,10 +20,12 @@ git config секция.параметр значение
|
||||
|
||||
Делаем базовые настройки:
|
||||
```
|
||||
git config --global user.name "My name" # Имя пользователя по умолчанию для всех коммитов
|
||||
git config --global user.email my@mail.com # Почта пользователя по умолчанию для всех коммитов
|
||||
git config --global color.ui true # Включаем цветной вывод в командах git
|
||||
git config --global core.quotepath off # Для правильного отображение русских имен файлов
|
||||
git config --global user.name "My name" # Имя пользователя по умолчанию для всех коммитов
|
||||
git config --global user.email my@mail.com # Почта пользователя по умолчанию для всех коммитов
|
||||
git config --global color.ui true # Включаем цветной вывод в командах git
|
||||
git config --global core.quotepath off # Для правильного отображение русских имен файлов
|
||||
git config --global core.editor "code --wait" # Для использования vscode редактора для rebase
|
||||
git config --global fetch.prune true # Автоматическая очистка remote веток удаленных на сервере
|
||||
```
|
||||
|
||||
Дополнительно можно настроить удобные элиасы для часто используемых команд.
|
||||
@@ -33,20 +35,32 @@ git config --global core.quotepath off # Для правильного от
|
||||
```
|
||||
[user]
|
||||
name = ARNik
|
||||
email = r.anikeev@gmail.com
|
||||
email = arnik@arnik.ru
|
||||
signingkey = AEBB0598F42201E3
|
||||
[color]
|
||||
ui = true
|
||||
[core]
|
||||
quotepath = off # отображение русских имен файлов
|
||||
quotepath = off # отображение русских имен файлов
|
||||
editor = code --wait # vscode редактор для rebase
|
||||
[alias]
|
||||
ll = log --oneline --graph --decorate --all
|
||||
st = status --short
|
||||
co = checkout
|
||||
br = branch
|
||||
ct = commit
|
||||
sign = commit --amend --no-edit -S
|
||||
unsign = commit --amend --no-edit
|
||||
signoff = commit --amend --no-edit -s
|
||||
pr = remote prune origin
|
||||
|
||||
lg = log --graph --all\
|
||||
--pretty=format:'%Cred%h%Creset -%C(auto)%d %Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
|
||||
--pretty=format:'%Cred%h%Creset -%C(auto)%d %Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset %G?'
|
||||
|
||||
# to pevent "fatal: detected dubious ownership in repository"
|
||||
[safe]
|
||||
directory = *
|
||||
[gpg "ssh"]
|
||||
allowedSignersFile = ~/.ssh/allowed_signers
|
||||
```
|
||||
---
|
||||
Для изучения Git и в качестве справки хочу порекомендовать:
|
||||
|
||||
Reference in New Issue
Block a user