2017-07-15 235 views
3

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

+0

请参阅https://security.stackexchange.com/q/120706 – torek

+0

该帖子并不完全回答我的主要问题。我知道SSH用于身份验证,但为什么不能用SSH代理管理(可能是不同的)密钥而不是GPG签名提交? –

+0

事实上,如果你阅读它并且(和它的参考文献),你会发现它在理论上是可行的,这只是不方便*而已。另外,PGP还有其他特性(并不是Git直接使用它们),Git本身只是调用一些外部软件,但是在这些情况下,密钥撤销等都是有用的。 – torek

回答

6

Git中签什么的第一个概念是在commit ec4465a, Git v0.99, Apr. 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 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)

+0

谢谢,这个答案确实增加了我需要理解的背景。 –

0

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

你可以创建一个git仓库,并且永远不会离开你的本地磁盘。您可以使用git协议或http或https或网络文件系统......这些都不涉及ssh,但您仍然可以对提交进行签名,因为这会独立于任何网络传输或其他推式/提交共享您的提交。

+0

这是一个有效的观点,但我的想法是SSH和它的工具集更加无处不在,那么为什么不利用它呢?我开始签署提交,不得不下载GPG工具集,这引起了我的这个问题。最重要的答案解释了原因。 –

1

您不应该使用ssh来签名提交的原因是密码学的常见规则之一:您不应该为不同的应用程序/用例使用相同的密钥。

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