帶GPG簽名的Git tag

原文地址:http://airk000.github.io/git/2013/09/30/git-tag-with-gpg-key

Git tag

Tag用來做什麼?

Tag即標籤,用以給項目倉儲打標籤,通常用作里程碑標識,以方便項目進度、發佈版本管理及規劃。
Git tag可以用來創建標籤,列出標籤表,刪除標籤及用以驗證帶有GPG簽名的帶標籤的項目。

git tag常見用法

創建Tag
git tag v1.0 >標記當前位置爲tag,tag名爲v1.0

git tag -m "Say something" v1.0 >標記當前位置爲tag,tag描述爲"Say something", tag名爲v1.0
列出tag表
git tag (-l) >列出tag表,只顯示標籤名

git tag -ln >列出tag表,並顯示其message(描述)
刪除tag
git tag -d [tag name] >刪除某個tag
驗證tag
git tag -v [tag name] >驗證某個tag的GPG簽名

GPG

GPG是加密軟件,可以使用GPG生成的公鑰在網上安全的傳播你的文件、代碼。

爲什麼說安全的?以Google所開發的repo爲例,repo即採用GPG驗證的方式,每個里程碑tag都帶有GPG加密驗證,假如在里程碑v1.12.3處你想要做修改,修改完後將這個tag刪除,然後又創建同名tag指向你的修改點,這必然是可以的。但是,在你再次clone你修改後的項目時,你會發現,你對此里程碑tag的改變不被認可,驗證失敗,導致你的修改在這裏無法正常實現。這就是GPG驗證的作用,這樣就能夠保證項目作者(私鑰持有者)所制定的里程碑別人將無法修改。那麼,就可以說,作者的代碼是安全傳播的。

爲什麼會有這種需求?一個項目從開發到發佈,再到後期的更新迭代,一定會存在若干的穩定版本與開發版本(存在不穩定因素)。作爲項目發起者、持有者,有權定義他(們)所認可的穩定版本,這個穩定版本,將不允許其他開發者進行改動。還以Google的repo項目爲例,項目所有者定義項目開發過程中的點A爲穩定版v1.12.3,那麼用戶在下載v1.12.3版本後,使用的肯定是A點所生成的項目、產品,就算其他開發者能夠在本地對v1.12.3進行重新指定,指定到他們修改後的B點,但是最終修改後的版本給用戶用的時候,會出現GPG簽名驗證不通過的問題,也就是說這樣的修改是不生效的。

可能還是不太好理解,說一個我曾經遇過的坑,repo在某個版本有個小錯誤,我在這個版本修復錯誤後,提交到內網的服務器給同事用(我重新定義這個版本的指向),最後發現同事在更新項目後,出現版本GPG簽名驗證錯誤,不能正常使用。

說了這麼多,希望大家能夠理解GPG簽名驗證的意義所在。下邊就說一說,如何在你的項目中使用這種方式。

生成GPG Key
gpg --gen-key 然後根據提示選擇你要的簽名

gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

請選擇您要使用的密鑰種類:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (僅用於簽名)
   (4) RSA (僅用於簽名)
您的選擇?  >選擇加密種類

RSA 密鑰長度應在 1024 位與 4096 位之間。
您想要用多大的密鑰尺寸?(2048)

請設定這把密鑰的有效期限。
         0 = 密鑰永不過期
      <n>  = 密鑰在 n 天后過期
      <n>w = 密鑰在 n 周後過期
      <n>m = 密鑰在 n 月後過期
      <n>y = 密鑰在 n 年後過期
密鑰的有效期限是?(0) >選擇密鑰有效期

對以上信息進行確認,然後輸入身份,最終確認,等待生成GPG Key。

您需要一個用戶標識來辨識您的密鑰;本軟件會用真實姓名、註釋和電子郵件地址組合
成用戶標識,如下所示:
    “Heinrich Heine (Der Dichter) <[email protected]>”

真實姓名: Keven Liu
電子郵件地址: [email protected]
註釋: GPG key for Keven
您選定了這個用戶標識:
    “Keven Liu (GPG key for Keven) <[email protected]>”

更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)? O
您需要一個密碼來保護您的私鑰。

我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動
鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。

生成過程中可能出現類似提示:

隨機字節不夠多。請再做一些其他的瑣事,以使操作系統能蒐集到更多的熵!
(還需要174字節)

瘋狂的敲打鍵盤吧,不過看好還需要多少,悠着點。

稍等片刻,GPG Key就能生成好了,驗證一下是否生成成功:

gpg --list-keys

如果輸出類似信息就代表屬於你的GPG Key生成成功了:

/home/keven/.gnupg/pubring.gpg
------------------------------
pub   2048R/AF26C87F 2013-09-30
uid                  Keven Liu (Gpg key for Keven Liu<[email protected]>) <[email protected]>
sub   2048R/C9A00F19 2013-09-30

上邊顯示的是公鑰,順便也看一下與之匹配的私鑰生成如何:

gpg --list-secret-keys

如果成功,會顯示類似信息,不過文件位置應該是/home/keven/.gnupg/pubring.gpg(keven是我的用戶名,你的機器上該是你的)

使用GPG加密你的tag
git tag -s "My tag message" v1.0 >是的,將-m 換做-s就是加密簽名了

不過,好像很多人會出現錯誤,比如:

gpg: WARNING: using insecure memory! 
gpg: please see http://www.gnupg.org/faq.html for more information 
gpg: skipped `Keven Liu <[email protected]>': secret key not available 
gpg: signing failed: secret key not available 
error: gpg failed to sign the tag 
fatal: unable to sign the tag

這個錯誤一Google的話都是教你怎麼生成一個GPG Key,其實不然,git tag有一條help這樣寫到:

-u, --local-user <key-id> 使用另一個Key簽名此tag

所以,這個錯誤可以這樣解決:

git tag -u "Keven Liu" -s "My tag message" v1.0

這樣,你的tag就用剛剛生成的GPG Key簽名了。可以查看一下項目的tag驗證信息:

git tag -v v1.0

終端輸出:

object c88d710635a97e6a634d2a1b25e3eba2f8a3574e
type commit
tag v1.0
tagger Keven Liu <[email protected]> 1380552288 +0800

My first tag with gpg key of my own
gpg: 於 2013年09月30日 星期一 22時45分05秒 CST 創建的簽名,使用 RSA,鑰匙號 AF36C27F
gpg: 完好的簽名,來自於“Keven Liu (Gpg key for Keven Liu<[email protected]>) <[email protected]>

至此,帶有GPG簽名驗證的tag就做好了,其他開發者將無法修改你所簽名的這個tag。

發佈了2 篇原創文章 · 獲贊 10 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章