Верификация коммитов с помощью GPG

Read on English

Цифровые подписи GPG (GNU Privacy Guard) применяются для верификации текстов, писем и других сообщений. Первоначальное название проекта — G10, в честь десятой статьи Конституции Германии (в РФ — 23 статья), гарантирующей тайну переписки и переговоров.

В частности, GPG используется для подписи коммитов в GitHub, чтобы убедиться, что работа отправлена именно доверенным автором. 

Что такое GPG

Наиболее известная программа для шифрования и цифровых подписей сообщений и файлов была создана в 1991 году Филиппом Циммерманном в США и была названа PGP — Pretty Good Privacy. Программу начали активно использовать за рубежом, что было недопустимо законодательством США, запрещавшим экспорт криптографического ПО. Против автора начали расследование, однако он обошел ограничение, опубликовав код программы в книге издательства MIT Press — выпуск и экспорт книг защищен первой поправкой в Конституцию о свободе печати. 

Philip Zimmermann

PGP получила широкое распространение, и для решения проблем с патентами в 1997 году компания PGP Inc. представила открытый стандарт OpenPGP, который получил open-source реализацию, названную GNU Privacy Guard (GnuPG или GPG). Ее выпустил немецкий разработчик Вернер Кох в 1999 году.

Werner Koch

А теперь рассмотрим, как GPG используется для подтверждения авторства коммитов на GitHub, GitLab или других платформах.

Как настроить GPG-подпись коммитов 

1. Устанавливаем GPG с официального сайта или через Brew

2. Открываем Terminal (на Windows — Git Bash) и генерируем ключ

gpg --full-generate-key

Из предложенных опций выбираем тип RSA and RSA, размер 4096 и срок действия. 

При вводе email убедитесь, что он соотвествует адресу, используемому на GitHub.

3. Выводим список ключей и копируем ID фингерпринта приватного ключа 

gpg --list-secret-keys --keyid-format LONG
Выделенная часть — ID PGP-ключа, которая является окончанием его фингерпринта.

4. Экспортируем ключ в формате ASCII по его ID

gpg --armor --export 3AA5C34371567BD2
Сгенерированный PGP-ключ

5. Копируем ключ и добавляем его в настройках профиля на GitHub (или GitLab)

После этого можно подписывать коммиты при работе через терминал:

git commit -S -m your commit message # Creates a signed commit

Флаг -S означает создание подписанного коммита. При этом может потребоваться ввод кодовой фразы, заданной при генерации GPG-ключа.

Настройка GitHub Desktop

Официальное приложение GitHub Desktop не поддерживает авторизацию коммитов, однако есть способы добавить такую возможность.

Просим git-клиент подписывать все коммиты и сообщаем ключ.

git config --global commit.gpgsign true git config --global user.signingkey 3AA5C34371567BD2

Добавляем опцию no-tty в конфигурационный файл GPG и определяем расположение программы.

Для macOS:

echo no-tty >> ~/.gnupg/gpg.conf git config --global gpg.program /usr/local/bin/gpg

Для Windows:

sed -i '/^no-tty/d' ~/.gnupg/gpg.conf git config --global --unset gpg.program

Теперь все коммиты, отправленные через GitHub Desktop будут подписаны и верифицированы. При первом коммите потребуется ввести кодовую фразу от GPG-ключа.

Авторство коммита подтверждено

При работе с GitLab инструкция отличается незначительно.