GnuPG 使用操作

安裝 GnuPG

  • Windows

CLI介面版本安裝指令

winget install -e --id GnuPG.GnuPG

含視窗GUI版本安裝指令

winget install -e --id GnuPG.Gpg4win
  • MacOS
brew install gnupg

產生金鑰指令

gpg --full-generate-key

執行結果如下,過程中會詢問一些問題,請依照自己需求回答,當然也可以都使用預設設定。

首先會要選擇 Key 的類型,基本上用預設的 RSA & RSA 就可以了。

請選擇你要使用的金鑰種類:
(1) RSA 和 RSA (預設)
(2) DSA 和 Elgamal
(3) DSA (僅能用於簽署)
(4) RSA (僅能用於簽署)
你要選哪一個? 1

再來需要輸入指定 Key 的長度,github 是建議 4096 位元。

RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間.
你想要用多大的金鑰尺寸? (2048) 4096
你所要求的金鑰尺寸是 4096 位元

接下來會詢問 Key 的有效期限,沒有特殊需求選 金鑰不會過期 就可以了。

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

最後會跟你確認是否有問題。

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

確認完後會要你輸入基本資料及安全密碼。

GnuPG 需要建構使用者 ID 以識別你的金鑰.
真實姓名:
電子郵件地址:
註釋:
你選擇了這個使用者 ID:
” <>”
變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? O

到這邊資料都輸入完了,等它產生完就會看到如下的畫面。

我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.
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 2019-04-02 [SC]
0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid ” <>”
sub rsa4096 2019-04-02 [E]

這個就是 GPG Keys 的 Fingerprint (指紋) 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279 , 而他與 Long key IDShort key ID 的關係如下表:

Fingerprint: 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
Long key ID: 4E1F799AA4FF2279
Short key ID: A4FF2279

可見兩個不同長度的 ID 只是截取 Fingerprint 的部分方便辨識而已,當有碰撞時就會變長了。

列出完整金鑰

gpg --list-keys

列出長金鑰

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

列出短金鑰

gpg --list-keys --keyid-format SHORT

提交公鑰到 Github

使用 gpg --list-secret-keys 去顯示出所有包含公要與私鑰的 GPG Keys。

將要使用的 Fingerprint (指紋) 複製起來,以下範例的 Fingerprint 為 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279

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 2019-04-02 [SC]
0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid [ultimate] <>
ssb rsa4096 2019-04-02 [E]

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

gpg --armor --export <Fingerprint>

gpg –armor –export 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279

它會輸出公鑰請將它貼到你的 Github / Gitlab / Bitbucket 設定中的 GPG Key 中。

公鑰長得像這樣,但長度會依產生時設定而定:

—–BEGIN PGP PUBLIC KEY BLOCK—–
OVG48HWL9GV5P8HG1ZE51VUAJR47WF9H5UGRGX01ZB9I6LVRV55
B7SF1KY5H026LT7J9FL9G67I1EMPR4UIJAA6W3QPWRB3QGYRJ0DP
AMR2XJAI69NM5LBIZJR7GHY7JPI5O1OA07D008M7BDSTP3VMS0ND
FWB1BPVR277S0611F6NQJCSJLRBTW9CJ54WN31ZK3JR0N
=SSDQ
—–END PGP PUBLIC KEY BLOCK—–

Git config 設定簽名

執行 git config --global user.signingkey <Fingerprint> 為 git 設定 Fingerprint。承之前範例的 Fingerprint 如下

# 僅限此倉庫
git config user.signingkey 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
# 全域設定
git config --global user.signingkey 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279

接下來在每次 Commit 時加上 -S 就可以簽署了。

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

如果不想每次都加上 -S 可以做以下設定

# 僅限此倉庫
git config commit.gpgsign true
# 全域設定
git config --global commit.gpgsign true

在 Commit 過程中會要求要輸入 GPG 的安全密碼。

推上去遠端倉庫後,就可以在 Commit 紀錄中看到被標示為 Verified

MacOS安裝的GPG並無內建GUI介面,因此在簽名時會碰上無法輸入密碼的錯誤

需要再多安裝GUI介面

brew install pinentry-mac

允許gpg使用gpg-agent

echo 'use-agent' >> ~/.gnupg/gpg.conf

設定pinentry-mac 使用於 gpg

echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf

重新啟動gpg-agent

killall gpg-agent

GPG 私鑰與公鑰備份

列出目前金鑰

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

備份金鑰

gpg --export --export-options backup --output public.gpg
gpg --export-secret-keys --export-options backup --output private.gpg
gpg --export-ownertrust > trust.gpg

還原金鑰

gpg --import public.gpg
gpg --import private.gpg
gpg --import-ownertrust trust.gpg

發佈留言