在 GitHub commit 上加上 GPG 簽章

其實 GitHub 老早就開始支援 GPG,不過因為不是必要條件,所以一直沒在意,最近看到有大神在講這件事,想說不然也來設定看看好了。

macOS 上是推薦用 GPG Suite,不過我看它在 High Sierra 上有一部份還是 beta 版,所以還是選擇手動設定 gpg-agent。

用 Homebrew 安裝軟體,其中 pinentry 是比較美觀一些的 Passphrase 輸入介面,而且可以和 mac 自己的 key chain 整合。

brew install gpg gpg-agent pinentry-mac

輸入一些資料後產生 key

gpg --gen-key

~/.gnupg/gpg-agent.conf 加入

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

Reload gpg-agent 後設定才會生效

gpg-connect-agent reloadagent /bye

可以用下面的指令測試是不是能正常簽章

echo "test" | gpg --clearsign

第一次執行時,理論上會出現 Passphress 的輸入介面

在 GitHub commit 上加上 GPG 簽章 1

正常在輸入完 passphrase 後應該出現成功簽章的資料

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

test
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEE6COevNitSzO1COM02saydp0usqsFAloeOQAACgkQ2saydp0u
sqseGgf/cESWSC42/ipQk8TfBAsuFpZ2ANf5PY+Uz2z54eb5wcPNq37uZXnXOq9P
vDdP4j7uMp4QOO4NcDwPG+Cqv5mJdch3TJ/KEg1iLUlBaZKp3I7U8qU5eSVI/N55
SofTVGX9Gbl69ZMKuP/a83+UFB4cwKDD4fBmnwiJV1LynK+PC29kqgxnpdQziP2/
A1YCd8DwC0L5+W1obsKxxeJlJSh7Lv0seIPhNI8MJ5+fVMtFV4DbyHxmX5u1iW88
7QEzpQJ9FUXcAGC6v67BaCIHp4mAgM0VbLItSP7eOVBmlm26daSBq+BMoYricYS8
zPPZuIC1p9M6XSE2OEoObZNlFUqIAw==
=Ah/L
-----END PGP SIGNATURE-----

本機端 git 的設定

找出剛剛建好的 key id

gpg --list-secret-keys

如果覺得 id 太長不好看,也可以加上下列兩種 parameter:

--keyid-format SHORT
--keyid-format LONG

指定 git commit 簽章要用的 key,還有開啟預設使用 GPG 簽章功能。

git config --global user.signingkey KEY_ID
git config --global commit.gpgsign true

如果是在同一次 gpg-agent 運作的期間,之後不用在輸入 passphrase;如果在 Pinentry Mac 裡有勾選 “save in keychain”,之後也不會再問,會存在 Keychain Access.app 裡 GnuPG 這個應用程式密碼裡。

GitHub 的設定

找出剛剛建好的 key id

gpg --list-secret-keys --keyid-format LONG

匯出 public key

gpg --armor --export KEY_ID

把 public key 加到 GitHub 的 Settings > SSH and GPG keys 裡,這樣 push 上去的 commit 就會有 “Verified” 的字樣了。

github-gpg-verified

Windows 上的設定

kleopatra-window

安裝 Gpg4win,用裡面提供的 Kleopatra 新增 key、匯出 public key,之後也是到 GitHub 上新增。

不知道 VS code 是不是自帶了 gpg 的程式或是有其他 PATH 相關的問題,git 要多設定 gpg.program 的路徑,不然會有找不到 key 的問題:

git config --global gpg.program 'C:/Program Files (x86)/GnuPG/bin/gpg.exe'

GitHub 自己的說明文件在:Signing commits with GPG