GPG 的基礎使用:交換公鑰

sunxyw發表於2022-09-10

要想透過 GPG 驗證來自的別人的資訊,我們首先需要跟他人交換公鑰。
整個交換過程分為四步:獲取對方的公鑰、匯入公鑰、驗證並簽名、設定信任級別。

獲取對方的公鑰

這個沒什麼好說,用通訊工具讓對方把公鑰發給你,甚至用電話讓對方一個個字母念出來都是可以的。
這裡我們以匯入 GitHub 的 GPG 公鑰為例。
在 GitHub 上,所有使用者的 GPG 公鑰都可以透過 https://github.com/<username>.gpg 地址獲得,而我們在網頁上的操作是由 web-flow賬號進行的,所以我們可以透過 github.com/web-flow.gpg 取得它的金鑰。

匯入公鑰

獲取之後,我們需要將公鑰匯入我們的公鑰庫。

$ gpg --import web-flow.gpg
gpg: key 4AEE18F83AFDEB23: public key "GitHub (web-flow commit signing) <noreply@github.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

隨後我們可以使用 gpg --list-keys命令確認匯入成功。

gpg --list-keys
/home/sunxyw/.gnupg/pubring.kbx
-------------------------------
<這部分是你自己的金鑰資訊>

pub   rsa2048 2017-08-16 [SC]
      5DE3E0509C47EA3CF04A42D34AEE18F83AFDEB23
uid           [ unknown] GitHub (web-flow commit signing) <noreply@github.com> <-- 看到這個就算成功

核對並簽名驗證

為了防止公鑰遭到篡改,一般我們需要聯絡對方本人核對公鑰的指紋(fingerprint)。
我們先進入 GPG 控制檯,gpg --edit-key <name>
這裡的 <name>可以是:

  • 金鑰ID(例:5DE3E0509C47EA3CF04A42D34AEE18F83AFDEB23)
  • 使用者名稱(例:GitHub)
  • 郵箱(例:noreply@github.com

我個人建議使用金鑰ID以確保唯一。
進入之後,我們可以使用 fpr命令輸出當前金鑰的指紋:

gpg> fpr
pub   rsa2048/4AEE18F83AFDEB23 2017-08-16 GitHub (web-flow commit signing) <noreply@github.com>
 Primary key fingerprint: 5DE3 E050 9C47 EA3C F04A  42D3 4AEE 18F8 3AFD EB23

然後與對方核對此處輸出的指紋,如果一致則說明公鑰沒有遭到篡改。
此處 GitHub 的指紋可在 docs.github.com/cn/authentication/... 找到。

GPG 的基礎使用:交換公鑰

核對無誤後,我們需要進行簽名以表示我們驗證了這一金鑰的正確性。

gpg> sign

pub  rsa2048/4AEE18F83AFDEB23
     created: 2017-08-16  expires: never       usage: SC
     trust: marginal      validity: unknown
 Primary key fingerprint: 5DE3 E050 9C47 EA3C F04A  42D3 4AEE 18F8 3AFD EB23

     GitHub (web-flow commit signing) <noreply@github.com>

Are you sure that you want to sign this key with your
key <你的金鑰>

Really sign? (y/N) y

最後輸入 save儲存退出。

設定信任級別

GPG 的信任級別分為以下幾個等級:

  • Ultimate:絕對信任,只會出現在你自己的金鑰上。
  • Full:完全信任,你相信這個金鑰,並信任它可以很好地管理簽發金鑰。使用這個金鑰簽名的其他金鑰也會受到信任。比如,你完全信任了 小明的金鑰,那麼由小明簽名過的 小美的金鑰也會受到信任。
  • Marginal:相對信任,你相信這個金鑰本身,但不確定它簽名的金鑰是否一定正確。如果一個金鑰被至少三個 Marginal級別的金鑰簽名,那麼該金鑰也是可信的。
  • Never:絕不信任,這個金鑰是完全不可信的。這也許以為著金鑰的所有者並不能確保它簽名的金鑰有效,或是該金鑰已被洩露因此不再可信。
  • Unknown:未知,這是金鑰的預設信任級別,該級別的金鑰不會被信任。

如果設定信任級別並沒有明確的規定或標準,因此完全取決於你自己。
比如我們想完全信任 GitHub 的公鑰。

$ gpg --edit-key <name>
gpg> trust
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say <-- 未知
  2 = I do NOT trust <-- 絕不信任
  3 = I trust marginally <-- 相對信任
  4 = I trust fully <-- 完全信任
  5 = I trust ultimately <-- 絕對信任
  m = back to the main menu <-- 返回

Your decision? 4
gpg> save

最後吧

執行 git log --show-signature即可檢視提交的簽名資訊。

GPG 的基礎使用:交換公鑰

可以看到我們成功識別到了 GitHub 的提交的簽名資訊。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章