Генерация GPG ключа

Подписываем GPG ключом коммиты в Git

Опубликовал Максим Баев, 13 апреля 2019, 01:45

Статья актуальна для Linux! Для Винды всё примерно тоже самое, только предварительно надо поставить программу gpg.

Ну вот решили например: 'пора бы уже подписывать коммиты в гите. Тоже хочу зелёный значок Verified '. Ну тогда надо делать. Само действо состоит из 3 частей: Сейчас будут короткие шаги, а дальше тоже самое с объяснениями.

  1. Генерация GPG ключа

    $ gpg2 --full-gen-key
    
  2. Загрузка в сервис управления репозиторием (GitLab, GitHub)

    $ gpg2 --list-secret-keys --keyid-format LONG i@mbaev.com
    sec   rsa4096/30F2B65B9246B6CA 2019-04-12 [SC]
    uid               [  абсолютно ] Maksim Baev <i@mbaev.com>
    ssb   rsa4096/B7ABC0813E4028C0 2019-04-12 [E]
    
    $ gpg2 --armor --export 30F2B65B9246B6CA
    

    Последняя команда выдаст публичный сертификат, вставляем его в GitLab или GitHub.

  3. Объяснение Git'у, чем подписывать коммиты

    $ git config --global user.signingkey 30F2B65B9246B6CA
    $ git config --global gpg.program gpg2
    $ git config --global commit.gpgsign true
    

Генерация ключа

Это оч простая процедура. Вам нужно заранее знать адрес вашего емейла, сильный пароль и ваше имя (O_o), но сначала пара нюансов:

  • Емейл проверяться не будет, но он должен совпадать с тем, что вы используете в Git'е для авторства коммитов. Он же должен использоваться для регистрации в GitLab/GitHub.
  • Возможно, у вас установлен gpg2 - используйте его. Проверить наличие можно так: which gpg2. Если появился какой-то путь - всё ок, идём дальше.

Что ж, генерируем 4-х килобайтный ключ:

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

gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/home/mbaev/.gnupg/secring.gpg' to gpg-agent
gpg: migration succeeded
Выберите тип ключа:
   (1) RSA и RSA (по умолчанию)
   (2) DSA и Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор? 1                                        # <--- Тут спрашивают про тип ключа
длина ключей RSA может быть от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048) 4096       # <--- Здесь спросят длину ключа
Запрошенный размер ключа - 4096 бит
Выберите срок действия ключа.
         0 = не ограничен
      <n>  = срок действия ключа - n дней
      <n>w = срок действия ключа - n недель
      <n>m = срок действия ключа - n месяцев
      <n>y = срок действия ключа - n лет
Срок действия ключа? (0)                            # <--- Не времени объяснять, просто жми ентер!
Срок действия ключа не ограничен
Все верно? (y/N) y                                  # <--- Ага

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

Ваше полное имя: Maksim Baev                        # <--- Вот тут нужно полное имя
Адрес электронной почты: i@mbaev.com                # <--- Здесь емейл, под которым уходят ваши коммиты
Комментарий: 
Вы выбрали следующий ID пользователя:
    "Maksim Baev <i@mbaev.com>"

Сменить (N)Имя, (C)Комментарий, (E)Адрес или (O)Принять/(Q)Выход? O # <--- O!

Дальше появится довольно интересное сообщение. Дважды.

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

Энтропия синоним хаоса. Чем больше энтропия, тем правдивее будут рандомные числа/биты, но все клацания мышкой и давление на батоны нужно делать, конечно же, вне консоли/терминала. Генерация ключа может занять довольно продолжительное время.

Загрузка в сервис управления репозиторием (GitLab, GitHub)

У нас получилась пара ключей - публичный и приватный. Публичный можно повесить на вашей остановке в объявлении, а приватный - в сейф.

Дальше нужно поместить публичный ключ в сервисы управления репозиториями, чтобы они знали, что вы - это вы. Ищем идентификатор сгенерированного ключа:

$ gpg2 --list-secret-keys --keyid-format LONG i@mbaev.com
sec   rsa4096/30F2B65B9246B6CA 2019-04-12 [SC]
uid               [  абсолютно ] Maksim Baev <i@mbaev.com>
ssb   rsa4096/B7ABC0813E4028C0 2019-04-12 [E]

Id: 30F2B65B9246B6CA
Теперь получаем полный экспорт публичного ключа:

$ gpg2 --armor --export 30F2B65B9246B6CA
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
27FlxRQW1FYS7/Mriv6AH55PH7YckL4xIZzcnS6lfBBZ4GSED2IJO6oHiRoHcNR+
...
+e8JU5lgbLrT22dYHze2/nHjDnCO6qG0C3LZetGmDPUXpsKF4jJgAGiPr2vyimEc
-----END PGP PUBLIC KEY BLOCK-----

Этот ключ кладём GitLab или GitHub (У BitBucket'а тоже есть такая страница).

Объяснение Git'у, чем подписывать коммиты

Почти всё, но каждый коммит должен подписываться этим ключом, иначе он не будет считается верифицированным.

  • Сообщаем Гиту, чем подписывать

    $ git config --global user.signingkey 30F2B65B9246B6CA
    
  • Устанавливаем программу gpg2 в качестве исполняемой. По умолчанию gpg.

    $ git config --global gpg.program gpg2
    
  • Говорим, что нужно подписывать все коммиты. Иначе, для подписи нужно будет использовать ключ -S при создании каждого коммита.

    $ git config --global commit.gpgsign true
    

На этом всё. gpg-gitlab

Другие посты