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

Dan*_*zyk 7 git digital-signature ssh-keys public-key gpg-signature

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

Von*_*onC 13

签约的第一个概念,什么 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.
 **/
Run Code Online (Sandbox Code Playgroud)

所以你的问题有腿.

第一个签名的提交使用了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
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您可以使用gpg代替ssh.虽然我没有经常看到相反的情况.
但是您可以使用与PGP/GPG一起使用的ssh密钥对.
这意味着第一个验证脚本可能仍然有效(提交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
Run Code Online (Sandbox Code Playgroud)

所以,"为什么git使用GPG密钥签名而不是使用SSH密钥?":这就是gpg的意图,而不是ssh,这与单独的openssh无关(它需要openssl).


Jak*_*uje 6

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

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