Почему git подписывается ключами GPG, а не ключами SSH?
Каковы различия между асимметричными ключами SSH и GPG и почему git поддерживает подпись с GPG, а не с помощью агента SSH?
4 ответа
Самое первое понятие о подписывании чего-либо в Git было упомянуто в коммите ec4465a, Git v0.99, апрель 2005 (в значительной степени с самого начала)
/**
* A signature file has a very simple fixed format: three lines
* of "object <sha1>" + "type <typename>" + "tag <tagname>",
* followed by some free-form signature that git itself doesn't
* care about, but that can be verified with gpg or similar.
**/
Так что у твоего вопроса есть ноги.
Самый первый подписанный коммит использовал gpg, но мог бы использовать что-нибудь еще ( commit 65f0d0e):
#!/bin/sh
object=${2:-$(cat .git/HEAD)}
type=$(cat-file -t $object) || exit 1
( echo -e "object $object\ntype $type\ntag $1\n"; cat ) > .tmp-tag
rm -f .tmp-tag.asc
gpg -bsa .tmp-tag && cat .tmp-tag.asc >> .tmp-tag
git-mktag < .tmp-tag
#rm .tmp-tag .tmp-tag.sig
Технически, вы можете использовать gpg вместо ssh. Хотя я не часто видел обратное.
Но вы можете использовать пару ключей ssh для PGP / GPG.
Это означает, что первый проверочный скрипт может все еще работать ( commit f336e71)... за исключением того, что он ожидал комментарий PGP:
#!/bin/sh
GIT_DIR=${GIT_DIR:-.git}
tag=$1
[ -f "$GIT_DIR/refs/tags/$tag" ] && tag=$(cat "$GIT_DIR/refs/tags/$tag")
git-cat-file tag $tag > .tmp-vtag || exit 1
cat .tmp-vtag | sed '/-----BEGIN PGP/Q' | gpg --verify .tmp-vtag -
rm -f .tmp-vtag
Итак, "почему git подписывается с помощью ключей GPG, а не с помощью ключей SSH?": Это именно то, что должен делать gpg, в отличие от ssh, который не может работать только с одним openssh (для этого требуется openssl).
Причина, почему вы не должны использовать ssh
подписывание коммитов является одним из общих правил криптографии: вы не должны использовать одни и те же ключи для разных приложений / вариантов использования.
В SSH вы используете ключ для аутентификации, но это не то, что подписывание ваших коммитов. Для этого гораздо больше подходит GPG, так как он уже широко используется для подписи электронных писем, файлов и так далее.
Одна из вероятных причин заключается в том, что не все, кто использует git, используют ssh.
Вы можете создать git-репо и никогда не оставлять его на локальном диске. Вы можете использовать протокол git, или http, или https, или сетевые файловые системы... ни одна из этих вещей не включает ssh, но вы все равно можете подписывать коммиты, потому что это происходит независимо от какого-либо сетевого транспорта или другого push/pull совместного использования ваших коммитов.,
FWIW, ведется работа по разрешению использования SSH-ключей для подписи (и проверки): https://lore.kernel.org/git/ [email protected] /
Это, по-видимому, будет полезно в ограниченных (например, корпоративных) контекстах, где git в настоящее время является единственной причиной для работы с GPG, а использование только SSH может сэкономить некоторые накладные расходы на управление ключами и программное обеспечение для пользователей...