Содержание
Backend Java Developer
Backend Java Developer

Oбновлена 2021-01-13: Добавил описание процесса экспорта GPG ключа

GPG (также известный как GnuPG) создавался как свободная альтернатива несвободному PGP. GPG используется для шифрования информации и предоставляет различные алгоритмы (RSA, DSA, AES и др.) для решения этой задачи.

Нас же интересует использование GPG вместе с Git. Git является криптографически защищённой системой, но эти механизмы сложны в использовании.

Любой человек может подписаться любым именем и email в git. Никакой верификации при этом не происходит.

git config user.name 'Pete Houston'
git config user.email 'contact@petehouston.com'

Таким образом любой человек может попробовать выдать свои коммиты за ваши, например, чтобы внедрить вредоносный код.

Чтобы проверить, что коммиты действительно получены из доверенного источника, в Git есть несколько способов подписать и проверить исходники, используя GPG.

Вот как это выглядит в GitHub

Подписанный коммит в GitHub
Подписанный коммит в GitHub

Если вы хотите подписать что-то, вам необходим настроенный GPG и персональный ключ.

Посмотреть список ключей можно следующей командой.


gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
views: 168

---------------------------------
pub   2048R/0A46826A 2014-06-04
uid                  Scott Chacon (Git signing key) 
sub   2048R/874529A9 2014-06-04 

Если у вас не установлен ключ, вы можете сгенерировать его с помощью gpg -gen-key.

gpg --gen-key

Вам необходимо будет ввести вашу почту, ФИО и пароль для защиты GPG.

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


gpg --gen-key
out gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
out This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Замечание: "gpg --full-generate-key" вызывает полнофункциональный диалог создания ключа.

GnuPG должен составить идентификатор пользователя для идентификации ключа.

Ваше полное имя: Struchkov Mark
Адрес электронной почты: git@upagge.ru
Вы выбрали следующий идентификатор пользователя:
    "Struchkov Mark "

Сменить (N)Имя, (E)Адрес; (O)Принять/(Q)Выход? O
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
gpg: ключ 964B40928E4C9088 помечен как абсолютно доверенный
gpg: сертификат отзыва записан в '/home/upagge/.gnupg/openpgp-revocs.d/4HZ8UHGKEJ4EQUEQLN67BAKYYJJWFTF8FSXT2BK6.rev'.
открытый и секретный ключи созданы и подписаны.

pub   rsa3072 2020-12-26 [SC] [годен до: 2022-12-26]
      4HZ8UHGKEJ4EQUEQLN67BAKYYJJWFTF8FSXT2BK6
uid                      Struchkov Mark 
sub   rsa3072 2020-12-26 [E] [годен до: 2022-12-26]

По умолчанию ключ GPG годен год.

Иногда необходимо получить ключ. Делается это следующей командой:

gpg --export -a "your@domain.com"

Экспорт ключа GPG

Это не обязательно, но в некоторых случаях необходимо сделать ваш ключ доступным и узнаваемым в Интернете.

Выполните эту команду:

gpg --send-keys 3AA5C34371567BD2
Не волнуйтесь, эта команда отправит только публичный ключ.

Если у вас есть приватный ключ для подписи, вы можете настроить Git так, чтобы этот ключ использовался для подписи, установив значение параметр user.signingkey config.

$ git config --global user.signingkey 0A46826A

Теперь Git будет использовать ваш ключ по умолчанию для подписи тегов и коммитов.

Персонально для репозитория можно указать другой GPG ключ. Например я так сделал для работы:

git config --local user.signingkey 7BGC7M6M

Так же можно добавить ключ вручную в файл .gitconfig в параметр signingkey.

Для глобальной настройки:

[user]
	name = uPagge
	email = spam@upagge.ru
	signingkey = Q6RNBLWTDFVRXX8YBWTSWDDX3C7AA332JRTVFT8T
[commit]
	gpgsign = true
[core]
	autocrlf = input

Для персональной настройки репозитория используется переменная signingkey в файле config, который лежит в папке .git.

[user]
	name = Стручков Марк
	email = mstruchkov@work.com
    signingkey = JFU7GGCEGQ3CY59E67Y9FAG2U83SN43N2G6DTBBP

Чтобы получить галочку верифицированного комита, необходимо сообщить гитхабу о новом GPG ключе. Перед этим убедитесь, что email из GPG ключа добавлен в ваш аккаунт.

Чтобы добавить ваш ключ в GitHub перейдите в Settings > SSH and GPG keys. Вас интересует кнопка “New GPG key”

Теперь необходимо получить публичный ключ. Для этого выполните команду:

gpg --armor --export you@email.ru

Скопируйте целиком полученное значение, вставьте его в поле и нажмите “Add GPG key”. Если все прошло успешно, то вы увидите ваш ключ в списке.

В более поздних версиях Git’а (v1.7.9 и выше) можно подписывать отдельные коммиты. Если вы хотите подписывать коммиты напрямую, а не только теги, вам нужно добавить -S к вашей команде git.


$ git commit -a -S -m 'Signed commit'

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) "
2048-bit RSA key, ID 0A46826A, created 2014-06-04

[master 5c3386c] Signed commit
 4 files changed, 4 insertions(+), 24 deletions(-)
 rewrite Rakefile (100%)
 create mode 100644 lib/git.rb 
IntelliJ IDEA
Среда разработки IntelliJ IDEA автоматически подписывает все ваши коммиты, если вы установили глобальный ключ.

Чтобы увидеть и проверить эти подписи, существует также опция --show-signature для git-лога.


git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun  4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) "
Author: Scott Chacon 
Date:   Wed Jun 4 19:49:17 2014 -0700

    Signed commit 

Подписывать теги и коммиты - это здорово. При использовании подписей в своем обычном рабочем процессе убедитесь, что все в вашей команде понимают, как это сделать. Если вы этого не сделаете, то в конечном итоге потратите много времени, помогая людям понять, как переписать свои коммиты с помощью подписанных версий.

Убедитесь, что вы понимаете GPG и преимущества подписания, прежде чем принимать это как часть стандартного рабочего процесса.

Комментарии