2017-07-15 233 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更加合適,因爲它已被廣泛用於簽署電子郵件,文件等。