На прошлой неделе GitHub наконец-то выпустил SSH-подпись кода. Git ввел подписание с помощью SSH-ключа почти год назад. Технически вы могли использовать SSH-подпись кода и раньше, но GitHub просто показывал страшный значок «Unverified badge».
Преимущества подписи кода
Если вы участвуете в крупных проектах с открытым исходным кодом, большинство из них требуют подписывать код. Почему?
В Git’е можно выдать себя за кого угодно. Например:
git -c user.name='Linus Torvalds' -c user.email='torvalds@linux-foundation.org' commit -m "hi"
Теперь, если вы зафиксируете что-то на GitHub, это будет отображаться как то, что зафиксировал Linux Torvalds. Ознакомьтесь с этой статьей для получения дополнительной информации по этой теме. Почему это не опасно? Из-за подписи кода, если вы подписываете свой код, другие могут быть на 100% уверены, что это сделали вы.
Почему SSH вместо GPG?
На мой взгляд, есть несколько обоснованных причин.
-
В Windows GPG подписывает код ужасно, вы можете найти бесчисленное количество тем на StackOverflow об ошибках и багах. Мой агент GPG любит умирать по крайней мере раз в неделю. Тогда мне приходится убивать агента, перезапускать его, снова пытаться выполнить подпись, она все еще не работает, снова перезапускать его и, наконец, она работает. Это ОЧЕНЬ раздражает.
-
Вы можете использовать один и тот же SSH-ключ для аутентификации и подписи, поэтому вам не придется иметь дело с двумя отдельными ключами.
Настройка
Эти команды должны работать на Windows, Linux и macOS, если вы используете Git Bash (если у вас проблемы с ~ на Windows, используйте относительные пути).
Давайте сгенерируем новый ключ (вы можете использовать существующие SSH-ключи):
ssh-keygen -t ed25519 -C "email@example.com"
Вы можете выбрать место сохранения файла и имя файла, я рекомендую использовать значения по умолчанию. Также вам будет предложено ввести пароль. Если вы приняли параметры по умолчанию, ваш ключ должен находиться в ~/.ssh
. Теперь добавьте ваш новый ключ в ssh-агент.
ssh-add ~/.ssh/id_ed25519
Если вы видите ошибку, возможно, ваш ssh-агент не запущен, запустите его:
eval "$(ssh-agent -s)"
Теперь давайте настроим интеграцию с Git.
git config --global gpg.format ssh
Теперь скопируйте содержимое файла открытого ключа ~/.ssh/id_ed25519.pub
.
git config --global user.signingkey 'ssh-ed25519 AAAAC3... email@example.com'
Загрузка ключа на GitHub
Теперь перейдите к настройкам GitHub. Нажмите кнопку Добавить новый SSH-ключ. Убедитесь, что вы выбрали ключ подписи. И вставьте содержимое файла открытого ключа.
Теперь сделайте коммит в репозиторий, нажмите на коммит, и вы увидите красивый значок верификации. Вы можете проверить отпечаток пальца:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
Отзыв старого ключа GPG
Если вы хотите, вы можете легко отозвать свой старый GPG.
Перечислите ваши текущие ключи:
gpg --list-keys
В первой строке вам нужен идентификатор вашего открытого ключа, что-то вроде: ABCD1234
, затем отзовите свой ключ:
gpg --output revoke.asc --gen-revoke key
Затем импортируйте сохраненный вами сертификат отзыва:
gpg --import revoke.asc
Вы успешно отозвали свой ключ в связке ключей, теперь вам нужно удалить тот же GPG ключ в вашем аккаунте GitHub и загрузить его снова. Если вы всё сделали правильно, посмотрите на старый коммит, и вы увидите оранжевый значок «Revoked».