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

问题描述 投票:6回答:3

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

git digital-signature ssh-keys public-key gpg-signature
3个回答
10
投票

在Gaz中签署任何东西的第一个概念在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 openssh alone (it needs openssl)

As commentedtorek,使用SSH在理论上是可行的,它只是不方便。

此外,PGP还有额外的功能(并不是Git直接使用它们--Git本身只是调用一些外部软件 - 但是在这些情况下,密钥撤销之类的东西很有用)。


2
投票

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

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


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.