要想透過 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> 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
即可檢視提交的簽名資訊。
可以看到我們成功識別到了 GitHub 的提交的簽名資訊。
本作品採用《CC 協議》,轉載必須註明作者和本文連結