iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 5
1
DevOps

遠離 DevOops系列 第 5

[Day 5] Oops!Gitea - 防止git commit被偽造

在Gitea上使用GPG簽署 [Mac]

今天來教大家在gitea推commit上去時,防止git commit被偽造。

為什麼會需要使用GPG簽署commit

在自己git的名字跟信箱都被公開的情況下,每個人的commit都可能被偽造。
要如何保證這些commit是由你的電腦下的呢?

GPG(GNU Privacy Guard)也可以說是GnuPG,是一個加密工具,通常用來驗證身份

現在我們就要來將 git commit 加上 GPG 簽署,讓它 Push 到 Github 等代管平台後,別人可以確定這份 Commit 是你提交的

主要目的是避免git commit 被別人偽造

Homebrew 安裝


如果系統是 MacOS 的人,且有裝 Homebrew 就可以直接用它來安裝,套件名稱為 gnupg
brew install gnupg
其他的OS或是沒有 Homebrew 的,可以直接到官方網站下載安裝檔。

官方網站載點

產生 GPG keys


打開終端機執行
gpg --full-generate-key
可以根據自己的需求填寫,不知道的話就使用預設值
選擇金鑰種類,基本上使用預設的 RSA & RSA 就ok囉
請選擇你要使用的金鑰種類:
   (1) RSA 和 RSA (預設)
   (2) DSA 和 Elgamal
   (3) DSA (僅能用於簽署)
   (4) RSA (僅能用於簽署)
你要選哪一個? 1

再來會要輸入 Key 的長度,github 是建議 4096 位元
RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間
所以在gitea上也選擇4096

你想要用多大的金鑰尺寸? (2048) 4096
你所要求的金鑰尺寸是 4096 位元

通常會使用0不會過期。

請指定這把金鑰的有效期限是多久.
         0 = 金鑰不會過期
      <n>  = 金鑰在 n 天後會到期
      <n>w = 金鑰在 n 週後會到期
      <n>m = 金鑰在 n 月後會到期
      <n>y = 金鑰在 n 年後會到期
金鑰的有效期限是多久? (0) 0

確認以上是否正確。

以上正確嗎? (y/N) Y

確認完後會要你輸入基本資料及安全密碼。
GnuPG 需要建構使用者 ID 以識別你的金鑰.

真實姓名: <Name>
電子郵件地址: <Email>
註釋:
你選擇了這個使用者 ID:
    "<Name> <<Email>>"
變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? O

Oops!這裡要注意

接下來,會出現亂碼的畫面
https://ithelp.ithome.com.tw/upload/images/20200911/201152895zQmu1vS4v.jpg
會叫你輸入密碼,至少要8碼
然後要記住這個密碼讓我們先取名「A密碼」
然後要輸入兩次

到這邊資料都輸入完了,等它產生完就會看到如下的畫面。
在這個步驟需要等一下

我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
gpg: /Users/user/.gnupg/trustdb.gpg: 建立了信任資料庫
gpg: 金鑰 xxxxxxxxxxxxxxx 已標記成徹底信任了
gpg: 目錄 '/Users/user/.gnupg/openpgp-revocs.d' 已建立
gpg: revocation certificate stored as '/Users/user/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxx.rev'
公鑰和私鑰已建立及簽署.


pub   rsa4096 2020-09-10 [SC]
      BD4FF21F12790D69E122699AAB4E1F7BA077B37A
uid                      "<Name> <<Email>>"
sub   rsa4096 2020-09-10 [E]
GPG Keys 產生的Fingerprint 為BD4FF21F12790D69E122699AAB4E1F7BA077B37A
 Fingerprint: BD4FF21F12790D69E122699AAB4E1F7BA077B37A
 Long key ID:                         AB4E1F7BA077B37A
 Short key ID:                                A077B37A

可見兩個不同長度的 ID 只是截取 Fingerprint 的部分方便辨識而已,當有碰撞時就會變長了。
提交公鑰到 Github / Gitlab / Bitbucket
使用 gpg --list-secret-keys 去顯示出所有包含公要與私鑰的 GPG Keys。
將要使用的 Fingerprint (指紋) 複製起來,以下範例的 Fingerprint 為 BD4FF21F12790D69E122699AAB4E1F7BA077B37A 。

 gpg --list-secret-keys

gpg: 正在檢查信任資料庫
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深度: 0  有效:   1  已簽署:   0  信任: 0-, 0q, 0n, 0m, 0f, 1u
/Users/user/.gnupg/pubring.kbx
---------------------------------
sec   rsa4096 2020-09-10 [SC]
      BD4FF21F12790D69E122699AAB4E1F7BA077B37A
uid           [ultimate] <Name> <<Email>>
ssb   rsa4096 2020-09-10 [E]

執行 gpg --armor --export <Fingerprint> ,承上範例的 Fingerprint 如下

gpg --armor --export BD4FF21F12790D69E122699AAB4E1F7BA077B37A

公鑰輸出如下:

-----BEGIN PGP PUBLIC KEY BLOCK-----
OVG48HWL9GV5P8HG1ZE51VUAJR47WF9H5UGRGX01ZB9I6LVRV55
B7SF1KY5H026LT7J9FL9G67I1EMPR4UIJAA6W3QPWRB3QGYRJ0DP
AMR2XJAI69NM5LBIZJR7GHY7JPI5O1OA07D008M7BDSTP3VMS0ND
FWB1BPVR277S0611F6NQJCSJLRBTW9CJ54WN31ZK3JR0N
=SSDQ

-----END PGP PUBLIC KEY BLOCK-----

再來,請將它貼到你的 Gitea 設定中的 GPG Key 中。

https://ithelp.ithome.com.tw/upload/images/20200912/201152892BH68ytA9V.png

按下 管理 GPG 金鑰 >> 增加金鑰,金鑰內容貼上!

https://ithelp.ithome.com.tw/upload/images/20200912/20115289SpbRDOT62C.png


url路徑

${your_gitea_domain}/user/settings/keys

提交包含簽署的 Commit


git 設定 signingkey
git config --global user.signingkey <Fingerprint>

# 僅限此倉庫
git config user.signingkey BD4FF21F12790D69E122699AAB4E1F7BA077B37A

# 全域設定
git config --global user.signingkey BD4FF21F12790D69E122699AAB4E1F7BA077B37A

之後每Commit 時加上 -S 就可以簽署囉

git commit -S -m "Add xxx.txt"

如果懶,不想每次都這樣做的話

# 僅限此倉庫
git config commit.gpgsign true

# 全域設定
git config --global commit.gpgsign true

在 Commit 過程中會要求要輸入 GPG 的安全密碼。
推上去遠端倉庫後,就可以在 Commit 紀錄中看到被標示為 Verified 了 /images/emoticon/emoticon07.gif

https://ithelp.ithome.com.tw/upload/images/20200912/2011528943CK8Vrnam.png

再來就是因為Mac重開機後都會在叫你輸入一次金鑰
所以懶的話就

安裝 pinentry-mac


brew install pinentry-mac

如果不想再被新增key的話,將以下設定新增至 ~/.gnupg/gpg.conf

no-tty

以下設定新增至 ~/.gnupg/gpg-agent.conf

pinentry-program /usr/local/bin/pinentry-mac

清除背景執行的 gpg-agent

killall gpg-agent

再來就試著 commit&push到 gitea上確認吧
push後會跑出視窗需要輸入密碼,這裡就要輸入我們剛剛打的「A密碼」
https://ithelp.ithome.com.tw/upload/images/20200911/20115289V4i5ZPWvlX.jpg

分支設定

另外在gitea的專案設定內選擇分支保護,有個Require Signed Commits可以勾選!
可以讓推上去的commit都必須有通過簽署的,以防止被偽造唷~

https://ithelp.ithome.com.tw/upload/images/20200913/20115289ftJ4YYgM3H.png

https://ithelp.ithome.com.tw/upload/images/20200913/20115289wu6XwFHHRp.png

那麼今天我們就完成「在Gitea使用GPG簽署commit」囉,是不是棒呢?

我試著讓同事們去使用GPG簽署commit,平均只要10分鐘內就可以完成設定囉,相信大家都可以做到的/images/emoticon/emoticon58.gif


上一篇
[Day 4] Oops!Gitea - 超方便的功能及應用
下一篇
[Day 6] Oops!Gitea - WebHook
系列文
遠離 DevOops30

尚未有邦友留言

立即登入留言