为什么git使用GPG密钥签名而不是使用SSH密钥?

时间:2017-07-15 15:38:36

标签: git digital-signature ssh-keys public-key gpg-signature

SSH和GPG非对称密钥之间有什么区别?为什么git支持使用GPG签名而不是使用SSH代理?

3 个答案:

答案 0 :(得分:8)

commit ec4465a, Git v0.99, Apr. 2005中引用了在Git中签署任何的第一个概念(几乎从一开始就是这样)

/**
 * 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 in place of ssh。虽然我没有经常看到相反的结果 但您可以使用an ssh key-pair be used with 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,which cannot do with with openssh alone (it needs openssl)

答案 1 :(得分:2)

您不应使用ssh进行签名提交的原因是加密的常见规则之一:您不应对不同的应用程序/用例使用相同的密钥。

在SSH中,您使用密钥进行身份验证,但这与签名提交不同。为此,GPG更适合,因为它已被广泛用于签署电子邮件,文件等。

答案 2 :(得分:1)

一个可能的原因是并非所有使用git的人都使用ssh。

您可以创建一个git repo,但永远不会离开本地磁盘。您可以使用git协议,http或https或网络文件系统...这些都不涉及ssh,但您仍然可以签署提交,因为这与任何网络传输或提交的其他推/拉共享无关