帶GPG簽名的Git tag

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

 

Git tag


###Tag用來作什麼?git

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

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生成的公鑰在網上安全的傳播你的文件、代碼。redis


爲何說安全的?以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簽名驗證錯誤,不能正常使用。ui


說了這麼多,但願你們可以理解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) <heinrichh@duesseldorf.de>」

真實姓名: Keven Liu
電子郵件地址: airk908@gmail.com
註釋: GPG key for Keven
您選定了這個用戶標識:
    「Keven Liu (GPG key for Keven) <airk908@gmail.com>」

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

咱們須要生成大量的隨機字節。這個時候您能夠多作些雜事(像是敲打鍵盤、移動
鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會得到足夠的熵數。

生成過程當中可能出現相似提示:code

隨機字節不夠多。請再作一些其餘的雜事,以使操做系統能蒐集到更多的熵!
(還須要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<airk908@gmail.com>) <airk908@gmail.com>
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 <airk908@gmail.com>': 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 <airk908@gmail.com> 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<airk908@gmail.com>) <airk908@gmail.com>」

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

相關文章
相關標籤/搜索