亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

如何使用SSH簽名Git提交記錄 環(huán)球視訊

2023-06-16 16:24:24 來(lái)源:濤叔的博客

Git 支持使用 GPG 來(lái)簽名提交記錄。但 GPG 用起來(lái)很復(fù)雜,一直賴得搞。


(資料圖)

Git 從 2.34 開(kāi)始支持使用 SSH 簽名。SSH 密鑰大家肯定都有,所以開(kāi)啟簽名也需要提上日程了。只不過(guò)這個(gè)功能發(fā)布后很長(zhǎng)時(shí)間內(nèi) GitHub 都不支持顯示 SSH 簽名,我也就沒(méi)有繼續(xù)推進(jìn)。昨天 GitHub 官宣正式支持 SSH 簽名。今天就把相關(guān)的內(nèi)容整理一下分享給大家。

首先,為什么要對(duì) Git 提交做簽名呢?那是因?yàn)樵?Git 中很容易偽造提交身份。

我們知道,Git 要求在提交前指定作者名字和郵箱:

gitconfiguser.name濤叔gitconfiguser.emailhi@taoshu.in

但這兩個(gè)配置可以隨便填。任何人都可以聲稱自己是濤叔。為了保護(hù)自己的聲譽(yù),我可以用非對(duì)稱加密技術(shù)對(duì)提交進(jìn)行簽名,然后公布自己公鑰。這樣其他人就可以根據(jù)這個(gè)公鑰來(lái)驗(yàn)證 Git 變更是不是由我本人提交的。只要我不泄漏自己的私鑰,別人就很難偽裝成我來(lái)做壞事。

實(shí)現(xiàn)簽名最常見(jiàn)的工具是 GPG。如果你玩過(guò) Linux肯定不陌生,很多發(fā)行版的包管理器都使用 GPG 對(duì)包做簽名,防止壞人偽造。

但 GPG 對(duì)小白用戶不友好,所以普通 Git 玩家很少會(huì)開(kāi)啟簽名。一直到 OpenSSH 8.0 發(fā)布,局面才有所改觀。因?yàn)檫@個(gè)版本的 OpenSSH 支持給任意數(shù)據(jù)進(jìn)行簽名。

簽名功能在 OpenSSH 8.7 出問(wèn)題了,建議使用 8.8 以后的版本

SSH 簽名的工具是 ssh-keygen。估計(jì)很多人只在第一次生成 SSH 密鑰的時(shí)候用到過(guò),后面就在沒(méi)碰過(guò)它了。雖然有點(diǎn)奇怪但簽名也驗(yàn)簽功能也是由 ssh-keygen 提供的。

假設(shè)有一個(gè)文件/tmp/a.txt,我們想使用~/.ssh/id_ed25519給它做簽名,我們可以:

ssh-keygen-Ysign-f~/.ssh/id_ed25519-nfile/tmp/a.txt

各參數(shù)的功能如下:

-Y sign表示計(jì)算簽名

-f指定私鑰

-n file是給簽名指定類型

file是我們自己定的,不同類型的簽名不會(huì)產(chǎn)生沖突

執(zhí)行之后就會(huì)得到一個(gè)簽名文件/tmp/a.txt.sig,內(nèi)容長(zhǎng)這個(gè)樣子:

-----BEGINSSHSIGNATURE-----U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgulKNunkcVxiDzY0wmqJo4rAG9LClGRq9mMfA/PqsKYkAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAAQP1FljU1ZQ327DZE11wjHIDgz1s0ULi7QO5rhg+MyEn12nwkV0fk69qDqmcpAE562xpIxa+yaGuMV6hK97Hq+gE=-----ENDSSHSIGNATURE-----

有了簽名,我們就可以驗(yàn)證是不是有壞人篡改了文件內(nèi)容了。驗(yàn)證簽名需要一個(gè)公鑰列表:

hi@taoshu.inssh-ed25519AAAAC3NzaC1lZDI1NTE5AAAAILpSjbp5HFcYg82NMJqiaOKwBvSwpRkavZjHwPz6rCmJts@tc...

第一列是公鑰的標(biāo)識(shí),我們這里用的是郵箱。第二列是公鑰類型,后面的部分是公鑰內(nèi)容,也就是~/.ssh/id_ed25519.pub的內(nèi)容。每個(gè)公鑰占一行。

驗(yàn)簽命令如下:

ssh-keygen-Yverify-fallowed_signers-Ihi@taoshu.in-nfile-s/tmp/a.txt.sig

各參數(shù)的功能如下:

-Y verify表示要驗(yàn)證簽名

-f 用來(lái)指定公鑰列表文件

-I 指定使用公鑰標(biāo)識(shí)

-n file 需要跟簽名的時(shí)候保持一致

-s 指定簽名所在文件

最后通過(guò)重定向?qū)⑽募?nèi)容傳給 ssh-keygen。如果驗(yàn)證通過(guò),則會(huì)得到如下結(jié)果:

Good"file"signatureforhi@taoshu.inwithED25519keySHA256:19/J4WKT7flBNcfmqQUqyAZeH4TdhMf5f0u+a4fZj1c

如果有人修改了文件內(nèi)容,則會(huì)得到如下結(jié)果:

Signatureverificationfailed:incorrectsignatureCouldnotverifysignature.

考慮到大多數(shù) Git 用戶都有自己的 SSH 密鑰,不支持 SSH 簽名豈不是很浪費(fèi)?于是 Git 2.34 集成了 SSH 簽名功能。

我們需要添加如下配置:

#使用SSH簽名gitconfiggpg.formatssh#指定SSH私鑰文件gitconfiguser.signingKey~/.ssh/id_ed25519.pub#指定可信公鑰列表文件gitconfiggpg.ssh.allowedSignersFile"$HOME/.config/git/allowed_signers"#開(kāi)啟自動(dòng)簽名(可選)gitconfigcommit.gpgsigntruegitconfigtag.gpgsigntrue

一番操作之后就準(zhǔn)備好了。接下來(lái)所有的 Git 提交都會(huì)使用 SSH 簽名。如果沒(méi)有開(kāi)啟自動(dòng)簽名,則可以在提交的時(shí)候通過(guò)-s參數(shù)來(lái)臨時(shí)開(kāi)啟。

在默認(rèn)配置下,我們看不出簽名后的提交跟普通提交有什么區(qū)別。如果想展示簽名信息,需要指定--show-signature參數(shù):

gitshow--show-signature|headcommit6292a43f184e8a347b6c8b4fe08191920c0e22a5Good"git"signatureforhi@taoshu.inwithED25519keySHA256:19/J4WKT7flBNcfmqQUqyAZeH4TdhMf5f0u+a4fZj1cAuthor:濤叔Date:WedAug2407542022+0800支持給TS的枚舉類型生成toString/parser函數(shù)diff--gita/autoload/lv.vimb/autoload/lv.vimindex22a6b38..a08deb9100644---a/autoload/lv.vim...

這個(gè)時(shí)候我們就看到了Good "git" signatures ...驗(yàn)證消息。

如果你使用 tig,也應(yīng)該添加同樣的參數(shù),或者在~/.tigrc中開(kāi)啟如下配置:

setlog-options=--show-signaturesetdiff-options=--show-signature

回想我們前面的例子,當(dāng)-n的值為file的時(shí)候,驗(yàn)簽信息是Good "file"...?,F(xiàn)在的信息是Good "git"...,說(shuō)明 Git 使用的參數(shù)是-n git。

但有個(gè)問(wèn)題,Git 到底把簽名信息存到了什么地方呢?答案是 commit 或者 tag 對(duì)應(yīng)的 object。如果你不了解 Git 的存儲(chǔ)模型,可以閱讀我的另一篇文章。

我們可以使用cat-file查看對(duì)象保存的內(nèi)容:

$gitcat-filecommit6292a43f184e8a347b6c8b4fe08191920c0e22a5treec17c1e92312dc7303018c3dc3cd25d26007305e2parente71d24c876aa6e82a69e1566623083923edcab03author濤叔1661298954+0800committer濤叔1661298954+0800gpgsig-----BEGINSSHSIGNATURE-----U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgulKNunkcVxiDzY0wmqJo4rAG9LClGRq9mMfA/PqsKYkAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAAQP1FljU1ZQ327DZE11wjHIDgz1s0ULi7QO5rhg+MyEn12nwkV0fk69qDqmcpAE562xpIxa+yaGuMV6hK97Hq+gE=-----ENDSSHSIGNATURE-----支持給TS的枚舉類型生成toString/parser函數(shù)

大家看 gpgsig 這一行,表示當(dāng)前提交的簽名信息。后面的每一行前面都有一個(gè)空格,表示這些行跟 gpgsig 是一個(gè)整體。

那 Git 是怎樣簽名的呢?我沒(méi)有去看源碼。但我猜是去掉 gpgsig 簽名信息,然后對(duì)剩余的內(nèi)容計(jì)算簽名,簽名類型為 git。于是我把對(duì)應(yīng)的內(nèi)容保存成文件簽了一下,跟 gpgsig 的值完全一致。

Git 簽名很好地解決了分裝身份的問(wèn)題。但如果對(duì)應(yīng)功能沒(méi)辦法在 GitHub 上顯示,那就不夠炫酷。所以 Git 2.34 剛發(fā)布就有用戶建議 GitHub 添加支持。昨天終于上線了

雖然 GitHub 支持展示 SSH 簽名信息,但是簽名和鑒權(quán)用的密鑰需要分別上傳。上傳的時(shí)候需要指定類型。哪怕是使用同一個(gè)密鑰也得額外再傳一次。

上傳公鑰之后,GitHub 就會(huì)展示對(duì)應(yīng)的 SSH 簽名。

以上就是本文的全部?jī)?nèi)容,希望能給大家一些參考。歡迎留言討論。

審核編輯:湯梓紅

標(biāo)簽:

上一篇:有線傳輸方式之串口通信
下一篇:最后一頁(yè)