核心維護者 PGP 指南¶
- 作者:
Konstantin Ryabitsev <konstantin@linuxfoundation.org>
本文件面向 Linux 核心開發者,特別是子系統維護者。它包含了一部分 Linux 基金會發布的更通用的《保護程式碼完整性》指南中的資訊。請閱讀該文件以獲取本指南中提及的一些主題的更深入討論。
PGP 在 Linux 核心開發中的作用¶
PGP 有助於確保 Linux 核心開發社群所生成程式碼的完整性,並在較小程度上,透過 PGP 簽名的電子郵件交換在開發者之間建立受信任的通訊渠道。
Linux 核心原始碼以兩種主要格式提供
分散式原始碼倉庫(git)
定期釋出快照(tarball)
Git 倉庫和 tarball 都帶有建立官方核心版本的核心開發者的 PGP 簽名。這些簽名提供加密保證,確保透過 kernel.org 或任何其他映象提供的可下載版本與這些開發者工作站上的內容完全相同。為此
git 倉庫在所有標籤上提供 PGP 簽名
tarball 在所有下載中提供分離的 PGP 簽名
信任開發者,而非基礎設施¶
自 2011 年核心 kernel.org 系統受到入侵以來,核心檔案專案的主要操作原則是假設基礎設施的任何部分都可能隨時被入侵。因此,管理員已採取深思熟慮的措施,強調信任必須始終寄託於開發者,而絕不能寄託於程式碼託管基礎設施,無論後者具有多麼良好的安全實踐。
上述指導原則是需要本指南的原因。我們希望確保透過信任開發者,我們不會僅僅將未來潛在安全事件的責任推卸給他人。目標是提供一套指導方針,開發者可以使用這些方針來建立安全的開發環境並保護用於建立 Linux 核心自身完整性的 PGP 金鑰。
PGP 工具¶
使用 GnuPG 2.2 或更高版本¶
您的發行版預設應該已經安裝了 GnuPG,您只需要驗證您正在使用的是一個相對較新的版本。要檢查,請執行
$ gpg --version | head -n1
如果您有 2.2 或更高版本,那麼您就可以開始使用了。如果您的版本低於 2.2,那麼本指南中的某些命令可能無法工作。
配置 gpg-agent 選項¶
GnuPG 代理是一個輔助工具,它在您使用 gpg 命令時會自動啟動,並在後臺執行,其目的是快取私鑰密碼。您應該瞭解兩個選項來調整密碼何時從快取中過期
default-cache-ttl(秒):如果您在生存時間過期之前再次使用同一金鑰,倒計時將重新開始一個新週期。預設值為 600(10 分鐘)。max-cache-ttl(秒):無論您自首次輸入密碼以來使用金鑰的時間有多近,如果最大生存時間倒計時過期,您都必須再次輸入密碼。預設值為 30 分鐘。
如果您覺得這些預設值太短(或太長),您可以編輯 ~/.gnupg/gpg-agent.conf 檔案來設定您自己的值
# set to 30 minutes for regular ttl, and 2 hours for max ttl
default-cache-ttl 1800
max-cache-ttl 7200
注意
在 shell 會話開始時不再需要手動啟動 gpg-agent。您可能需要檢查您的 rc 檔案,以刪除為舊版本 GnuPG 設定的任何內容,因為它們可能不再正確。
保護您的 PGP 金鑰¶
本指南假設您已經擁有用於 Linux 核心開發目的的 PGP 金鑰。如果您還沒有,請參閱前面提到的《保護程式碼完整性》文件,以獲取建立新金鑰的指導。
如果您的當前金鑰強度低於 2048 位 (RSA),您也應該建立一個新金鑰。
理解 PGP 子金鑰¶
PGP 金鑰很少由單個金鑰對組成——通常它是一個獨立的子金鑰集合,根據它們在建立時分配的能力,可用於不同的目的。PGP 定義了金鑰可以擁有的四種能力
[S] 金鑰可用於簽名
[E] 金鑰可用於加密
[A] 金鑰可用於身份驗證
[C] 金鑰可用於認證其他金鑰
具有 [C] 能力的金鑰常被稱為“主”金鑰,但這種術語具有誤導性,因為它暗示認證金鑰可以替代同一鏈上的任何其他子金鑰(就像物理“主金鑰”可以開啟為其他金鑰製作的鎖一樣)。由於情況並非如此,本指南將將其稱為“認證金鑰”以避免任何歧義。
充分理解以下幾點至關重要
所有子金鑰彼此完全獨立。如果您丟失了一個私有子金鑰,它無法從您鏈上的任何其他私鑰中恢復或重新建立。
除了認證金鑰外,可以有多個具有相同功能的子金鑰(例如,您可以擁有 2 個有效的加密子金鑰,3 個有效的簽名子金鑰,但只有一個有效的認證子金鑰)。所有子金鑰都是完全獨立的——加密到一個 [E] 子金鑰的訊息無法用您可能擁有的任何其他 [E] 子金鑰解密。
單個子金鑰可能具有多種功能(例如,您的 [C] 金鑰也可以是您的 [S] 金鑰)。
帶有 [C] (認證) 功能的金鑰是唯一可以用於指示與其他金鑰關係的金鑰。只有 [C] 金鑰可以用於
新增或撤銷具有 S/E/A 功能的其他金鑰(子金鑰)
新增、更改或撤銷與金鑰關聯的身份(uids)
新增或更改自身或任何子金鑰的過期日期
為信任網目的簽署其他人的金鑰
預設情況下,GnuPG 在生成新金鑰時會建立以下內容
一個同時具有認證和簽名功能的子金鑰([SC])
一個單獨的具有加密功能的子金鑰([E])
如果您在生成金鑰時使用了預設引數,那麼您將擁有這些。您可以透過執行 gpg --list-secret-keys 進行驗證,例如
sec ed25519 2022-12-20 [SC] [expires: 2024-12-19]
000000000000000000000000AAAABBBBCCCCDDDD
uid [ultimate] Alice Dev <adev@kernel.org>
ssb cv25519 2022-12-20 [E] [expires: 2024-12-19]
sec 條目下的長行是您的金鑰指紋——每當您在下面的示例中看到 [fpr] 時,它指的就是那個 40 個字元的字串。
確保您的密碼足夠強¶
GnuPG 使用密碼短語在將私鑰儲存到磁碟之前對其進行加密。這樣,即使您的 .gnupg 目錄被完整洩露或盜竊,攻擊者也無法在未首先獲取密碼短語以解密它們的情況下使用您的私鑰。
私鑰必須由一個強密碼短語保護,這一點絕對至關重要。要設定或更改它,請使用
$ gpg --change-passphrase [fpr]
建立單獨的簽名子金鑰¶
我們的目標是透過將您的認證金鑰移動到離線儲存介質來保護它,因此如果您只有一個組合的 [SC] 金鑰,那麼您應該建立一個單獨的簽名子金鑰
$ gpg --quick-addkey [fpr] ed25519 sign
注意
GnuPG 中的 ECC 支援
請注意,如果您打算使用不支援 ED25519 ECC 金鑰的硬體令牌,則應選擇“nistp256”而不是“ed25519”。請參閱下面關於推薦硬體裝置的部分。
備份您的認證金鑰以備災難恢復¶
您的 PGP 金鑰從其他開發者那裡獲得的簽名越多,您就越有理由建立一個不在數字媒體上存在的備份版本,以備災難恢復。
建立私鑰可列印硬複製的最佳方法是使用專門為此目的編寫的 paperkey 軟體。有關輸出格式及其相對於其他解決方案的優勢的更多詳細資訊,請參閱 man paperkey。Paperkey 應該已經為大多數發行版打包好了。
執行以下命令建立私鑰的硬複製備份
$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
打印出該檔案(或將輸出直接透過管道傳輸到 lpr),然後用筆在紙邊寫下您的密碼短語。強烈建議這樣做,因為金鑰列印件仍然用該密碼短語加密,如果您將來更改了它,您將不記得建立備份時它是什麼——保證。
將打印出來的檔案和手寫的密碼裝入信封,並存放在安全且受保護的地方,最好遠離您的家,例如您的銀行保險庫。
注意
您的印表機可能不再是連線到並行埠的簡單啞裝置,但由於輸出仍然用您的密碼短語加密,即使列印到“雲集成”的現代印表機也應該仍然是相對安全的操作。
備份您的整個 GnuPG 目錄¶
警告
!!!不要跳過此步驟!!!
擁有 PGP 金鑰的現成備份非常重要,以防您需要恢復它們。這與我們使用 paperkey 進行的災難級別準備不同。每當您需要使用您的認證金鑰時——例如更改您自己的金鑰或在會議和峰會後簽署其他人的金鑰時,您也將依賴這些外部副本。
首先,準備一個小型的 USB“拇指”驅動器(最好是兩個!),您將用它來備份。您需要使用 LUKS 對它們進行加密——請參閱您的發行版文件以瞭解如何完成此操作。
對於加密密碼,您可以使用與 PGP 金鑰相同的密碼。
加密過程完成後,重新插入 USB 驅動器並確保它正確掛載。將您的整個 .gnupg 目錄複製到加密儲存中
$ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
您現在應該測試以確保一切正常
$ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
如果沒有出現任何錯誤,那麼您就可以開始了。解除安裝 USB 驅動器,清楚地標記它,這樣您下次需要使用隨機 USB 驅動器時就不會把它搞混,然後把它放在一個安全的地方——但不要太遠,因為您會時不時地需要它,用於編輯身份、新增或撤銷子金鑰,或簽署其他人的金鑰。
從您的主目錄中移除認證金鑰¶
我們主目錄中的檔案並不像我們想象的那麼安全。它們可能透過多種不同方式洩露或被盜
在設定新工作站時,意外地快速複製主目錄
系統管理員的疏忽或惡意行為
透過安全性差的備份
透過桌面應用程式(瀏覽器、PDF 檢視器等)中的惡意軟體
在穿越國際邊境時受到脅迫
使用一個好的密碼來保護您的金鑰大大有助於降低上述任何風險,但密碼可以透過鍵盤記錄器、肩窺或任何其他方式被發現。因此,推薦的設定是將您的認證金鑰從您的主目錄中移除並存儲在離線儲存中。
警告
請參閱上一節,並確保您已完整備份您的 GnuPG 目錄。我們即將進行的操作將使您的金鑰失效,如果您沒有可用的備份!
首先,識別您的認證金鑰的 keygrip
$ gpg --with-keygrip --list-key [fpr]
輸出將是這樣的
pub ed25519 2022-12-20 [SC] [expires: 2022-12-19]
000000000000000000000000AAAABBBBCCCCDDDD
Keygrip = 1111000000000000000000000000000000000000
uid [ultimate] Alice Dev <adev@kernel.org>
sub cv25519 2022-12-20 [E] [expires: 2022-12-19]
Keygrip = 2222000000000000000000000000000000000000
sub ed25519 2022-12-20 [S]
Keygrip = 3333000000000000000000000000000000000000
找到 pub 行下面的 keygrip 條目(就在認證金鑰指紋的下方)。這將直接對應您 ~/.gnupg 目錄中的一個檔案
$ cd ~/.gnupg/private-keys-v1.d
$ ls
1111000000000000000000000000000000000000.key
2222000000000000000000000000000000000000.key
3333000000000000000000000000000000000000.key
您所要做的就是簡單地刪除與認證金鑰 keygrip 對應的 .key 檔案
$ cd ~/.gnupg/private-keys-v1.d
$ rm 1111000000000000000000000000000000000000.key
現在,如果您執行 --list-secret-keys 命令,它將顯示認證金鑰丟失(# 表示它不可用)
$ gpg --list-secret-keys
sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19]
000000000000000000000000AAAABBBBCCCCDDDD
uid [ultimate] Alice Dev <adev@kernel.org>
ssb cv25519 2022-12-20 [E] [expires: 2024-12-19]
ssb ed25519 2022-12-20 [S]
您還應刪除 ~/.gnupg 目錄中任何可能由舊版本 GnuPG 遺留的 secring.gpg 檔案。
如果您沒有“private-keys-v1.d”目錄¶
如果您沒有 ~/.gnupg/private-keys-v1.d 目錄,那麼您的私鑰仍然儲存在 GnuPG v1 使用的舊版 secring.gpg 檔案中。對您的金鑰進行任何更改,例如更改密碼或新增子金鑰,都應該自動將舊的 secring.gpg 格式轉換為使用 private-keys-v1.d。
完成此操作後,請務必刪除過時的 secring.gpg 檔案,該檔案仍包含您的私鑰。
將子金鑰移動到專用加密裝置¶
儘管認證金鑰現在已安全,免於洩露或被盜,但子金鑰仍在您的主目錄中。任何設法獲取這些金鑰的人都能夠解密您的通訊或偽造您的簽名(如果他們知道密碼)。此外,每次執行 GnuPG 操作時,金鑰都會載入到系統記憶體中,並可能被足夠高階的惡意軟體(想想熔斷和幽靈)從那裡竊取。
完全保護您的金鑰的最佳方法是將其移動到能夠進行智慧卡操作的專用硬體裝置。
智慧卡的好處¶
智慧卡包含一個加密晶片,能夠儲存私鑰並在卡本身上直接執行加密操作。由於金鑰內容從未離開智慧卡,因此您插入硬體裝置的計算機作業系統無法檢索私鑰本身。這與我們之前用於備份的加密 USB 儲存裝置非常不同——當 USB 裝置插入並掛載時,作業系統能夠訪問私鑰內容。
使用外部加密 USB 介質並不能替代擁有智慧卡功能的裝置。
可用智慧卡裝置¶
除非您所有的筆記型電腦和工作站都配備智慧卡讀卡器,否則最簡單的方法是購買一個實現智慧卡功能的專用 USB 裝置。有幾種選擇可供選擇
Nitrokey Start:開源硬體和自由軟體,基於 FSI Japan 的 Gnuk。少數支援 ED25519 ECC 金鑰的商用裝置之一,但提供的安全功能最少(例如抗篡改或某些側通道攻擊)。
Nitrokey Pro 2:類似於 Nitrokey Start,但更防篡改,並提供更多安全功能。Pro 2 支援 ECC 加密(NISTP)。
Yubikey 5:專有硬體和軟體,但比 Nitrokey Pro 便宜,並提供 USB-C 形式,對新型筆記型電腦更有用。提供 FIDO U2F 等附加安全功能,現在最終支援 NISTP 和 ED25519 ECC 金鑰。
您的選擇將取決於成本、您所在地區的運輸可用性以及開放/專有硬體的考量。
注意
如果您在 MAINTAINERS 中列出或擁有 kernel.org 賬戶,您有資格免費獲得由 Linux 基金會提供的 Nitrokey Start。
配置您的智慧卡裝置¶
您的智慧卡裝置在插入任何現代 Linux 工作站時應該“開箱即用”(TM)。您可以透過執行以下命令進行驗證
$ gpg --card-status
如果您看到完整的智慧卡詳細資訊,那麼您就可以開始使用了。不幸的是,排除所有可能導致您無法正常工作的原因超出了本指南的範圍。如果您在使用 GnuPG 時遇到智慧卡問題,請透過常規支援渠道尋求幫助。
要配置智慧卡,您需要使用 GnuPG 菜單系統,因為沒有方便的命令列開關
$ gpg --card-edit
[...omitted...]
gpg/card> admin
Admin commands are allowed
gpg/card> passwd
您應該設定使用者 PIN (1)、管理 PIN (3) 和重置碼 (4)。請務必記錄並安全地儲存這些資訊——特別是管理 PIN 和重置碼(它允許您完全擦除智慧卡)。您很少需要使用管理 PIN,因此如果您不記錄它,您將不可避免地忘記它是什麼。
回到主卡選單,您還可以設定其他值(如姓名、性別、登入資料等),但這並非必要,並且還會洩露您智慧卡的資訊,以防您丟失它。
注意
儘管名稱為“PIN”,但卡上的使用者 PIN 和管理 PIN 都不需要是數字。
警告
某些裝置可能要求您在更改密碼之前將子金鑰移動到裝置上。請查閱裝置製造商提供的文件。
將子金鑰移至您的智慧卡¶
退出卡片選單(使用“q”)並儲存所有更改。接下來,讓我們將子金鑰移動到智慧卡上。對於大多數操作,您需要您的 PGP 金鑰密碼和卡片的管理 PIN
$ gpg --edit-key [fpr]
Secret subkeys are available.
pub ed25519/AAAABBBBCCCCDDDD
created: 2022-12-20 expires: 2024-12-19 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/1111222233334444
created: 2022-12-20 expires: never usage: E
ssb ed25519/5555666677778888
created: 2017-12-07 expires: never usage: S
[ultimate] (1). Alice Dev <adev@kernel.org>
gpg>
使用 --edit-key 會再次將我們帶入選單模式,您會注意到金鑰列表略有不同。從這裡開始,所有命令都在此選單模式內執行,如 gpg> 所示。
首先,讓我們選擇要放入卡中的金鑰——您可以透過鍵入 key 1 來完成(它是列表中的第一個,即 [E] 子金鑰)
gpg> key 1
在輸出中,您現在應該在 [E] 金鑰上看到 ssb*。星號 * 表示當前“選中”的金鑰。它作為切換開關工作,這意味著如果您再次輸入 key 1,星號 * 將消失,並且該金鑰將不再被選中。
現在,讓我們把那個金鑰移到智慧卡上
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
由於它是我們的 [E] 金鑰,將其放入加密槽是合理的。當您提交選擇時,系統將首先提示您輸入 PGP 金鑰密碼,然後輸入管理 PIN。如果命令返回時沒有錯誤,則您的金鑰已成功移動。
重要:現在再次輸入 key 1 以取消選擇第一個金鑰,然後輸入 key 2 以選擇 [S] 金鑰
gpg> key 1
gpg> key 2
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1
您可以使用 [S] 金鑰進行簽名和認證,但我們想確保它在簽名槽中,所以選擇(1)。再次,如果您的命令返回時沒有錯誤,則操作成功
gpg> q
Save changes? (y/N) y
儲存更改將刪除您已移至卡中的金鑰(但沒關係,因為如果我們需要為替換智慧卡再次執行此操作,我們可以在備份中找到它們)。
驗證金鑰是否已移動¶
如果您現在執行 --list-secret-keys,您將在輸出中看到一個細微的區別
$ gpg --list-secret-keys
sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19]
000000000000000000000000AAAABBBBCCCCDDDD
uid [ultimate] Alice Dev <adev@kernel.org>
ssb> cv25519 2022-12-20 [E] [expires: 2024-12-19]
ssb> ed25519 2022-12-20 [S]
ssb> 輸出中的 > 表示子金鑰僅在智慧卡上可用。如果您回到您的金鑰目錄並檢視其中的內容,您會注意到那裡的 .key 檔案已被存根替換
$ cd ~/.gnupg/private-keys-v1.d
$ strings *.key | grep 'private-key'
輸出應包含 shadowed-private-key,表示這些檔案僅為存根,實際內容在智慧卡上。
驗證智慧卡功能是否正常¶
要驗證智慧卡是否按預期工作,您可以建立一個簽名
$ echo "Hello world" | gpg --clearsign > /tmp/test.asc
$ gpg --verify /tmp/test.asc
這將要求您在第一次命令時輸入智慧卡 PIN,然後在您執行 gpg --verify 後顯示“Good signature”。
恭喜您,您已成功地使竊取您的數字開發者身份變得極其困難!
其他常見的 GnuPG 操作¶
以下是您需要對 PGP 金鑰進行的一些常見操作的快速參考。
掛載您的安全離線儲存¶
以下任何操作都需要您的認證金鑰,因此您首先需要掛載您的備份離線儲存並告訴 GnuPG 使用它
$ export GNUPGHOME=/media/disk/foo/gnupg-backup
$ gpg --list-secret-keys
您要確保在輸出中看到 sec 而不是 sec#(# 意味著金鑰不可用,並且您仍在用常規的主目錄位置)。
延長金鑰有效期¶
認證金鑰的預設有效期為建立日期起 2 年。這樣做既出於安全原因,也為了使過時的金鑰最終從金鑰伺服器上消失。
要將金鑰有效期從當前日期延長一年,只需執行
$ gpg --quick-set-expire [fpr] 1y
您也可以使用一個特定的日期,如果這樣更容易記住的話(例如您的生日、1 月 1 日或加拿大國慶日)
$ gpg --quick-set-expire [fpr] 2025-07-01
記得將更新後的金鑰傳送回金鑰伺服器
$ gpg --send-key [fpr]
任何更改後更新您的工作目錄¶
使用離線儲存對您的金鑰進行任何更改後,您需要將這些更改匯入回您的常規工作目錄
$ gpg --export | gpg --homedir ~/.gnupg --import
$ unset GNUPGHOME
透過 ssh 使用 gpg-agent¶
如果您需要在遠端系統上籤署標籤或提交,可以將 gpg-agent 透過 ssh 轉發。請參閱 GnuPG wiki 上提供的說明
如果您可以修改遠端端 sshd 伺服器設定,它會執行得更流暢。
在 Git 中使用 PGP¶
Git 的核心功能之一是其去中心化的特性——一旦倉庫被克隆到您的系統,您就擁有專案的所有歷史記錄,包括所有標籤、提交和分支。然而,隨著數百個克隆倉庫的出現,任何人如何驗證他們的 linux.git 副本沒有被惡意第三方篡改?
或者,如果程式碼中發現了後門,並且提交中的“作者”行顯示是您所為,而您非常確定自己與此無關,那會發生什麼?
為了解決這兩個問題,Git 引入了 PGP 整合。簽名標籤透過確保其內容與建立標籤的開發者的工作站上的內容完全相同來證明倉庫的完整性,而簽名提交則使得未經您 PGP 金鑰的訪問幾乎不可能冒充您。
配置 git 使用您的 PGP 金鑰¶
如果您的金鑰環中只有一個私鑰,那麼您實際上不需要做任何額外的事情,因為它會成為您的預設金鑰。但是,如果您有多個私鑰,您可以告訴 git 應該使用哪個金鑰([fpr] 是您金鑰的指紋)
$ git config --global user.signingKey [fpr]
如何使用簽名提交¶
建立簽名提交很容易,但在 Linux 核心開發中使用它們要困難得多,因為它依賴於傳送到郵件列表的補丁,並且此工作流不會保留 PGP 提交簽名。此外,當您將倉庫變基以與上游匹配時,甚至您自己的 PGP 提交簽名最終也會被丟棄。因此,大多數核心開發者不屑於簽署他們的提交,並且會忽略他們工作中依賴的任何外部倉庫中的簽名提交。
然而,如果您的工作 git 樹在某些 git 託管服務(kernel.org、infradead.org、ozlabs.org 或其他)上公開可用,那麼建議您簽署所有 git 提交,即使上游開發者不直接從中受益。
我們推薦這樣做有以下原因
如果需要進行程式碼取證或跟蹤程式碼來源,即使是帶有 PGP 提交簽名的外部維護樹也將對此類目的很有價值。
如果您需要重新克隆本地倉庫(例如,在磁碟故障後),這讓您可以輕鬆驗證倉庫完整性,然後再恢復工作。
如果有人需要挑選您的提交,這允許他們在應用它們之前快速驗證其完整性。
建立簽名提交¶
要建立簽名提交,您只需將 -S 標誌傳遞給 git commit 命令(由於與另一個標誌衝突,它是大寫 -S)
$ git commit -S
配置 git 始終簽署提交¶
您可以告訴 git 始終簽署提交
git config --global commit.gpgSign true
注意
請確保在開啟此功能之前配置 gpg-agent。
如何處理簽名補丁¶
可以使用您的 PGP 金鑰簽署傳送到核心開發者郵件列表的補丁。由於現有的電子郵件簽名機制(PGP-Mime 或 PGP-inline)往往會給常規程式碼審查任務帶來問題,您應該使用 kernel.org 為此目的建立的工具,該工具將加密認證簽名放入郵件頭中(類似於 DKIM)
安裝和配置 patatt¶
Patatt 已經打包到許多發行版中,所以請先在那裡檢查。您也可以使用“pip install patatt”從 pypi 安裝它。
如果您已經透過 user.signingKey 配置引數在 git 中配置了您的 PGP 金鑰,那麼 patatt 不需要進一步配置。您可以透過在所需的倉庫中安裝 git-send-email 鉤子來開始簽署您的補丁
patatt install-hook
現在,您使用 git send-email 傳送的任何補丁都將自動用您的加密簽名進行簽名。
檢查 patatt 簽名¶
如果您使用 b4 來檢索和應用補丁,它將自動嘗試驗證它遇到的所有 DKIM 和 patatt 簽名,例如
$ b4 am 20220720205013.890942-1-broonie@kernel.org
[...]
Checking attestation on all messages, may take a moment...
---
✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers
✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall
✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls
---
✓ Signed: openpgp/broonie@kernel.org
✓ Signed: DKIM/kernel.org
注意
Patatt 和 b4 仍在積極開發中,您應該檢視這些專案的最新文件以瞭解任何新增或更新的功能。
如何驗證核心開發者身份¶
簽署標籤和提交很容易,但是如何驗證用於簽署內容的金鑰屬於實際的核心開發者而不是惡意的冒名頂替者呢?
使用 WKD 和 DANE 配置自動金鑰檢索¶
如果您還沒有大量其他開發者的公共金鑰,那麼您可以依靠金鑰自動發現和自動檢索來快速啟動您的金鑰環。GnuPG 可以利用其他委託信任技術,即 DNSSEC 和 TLS,來幫助您,如果從頭開始建立自己的信任網太過艱鉅的話。
將以下內容新增到您的 ~/.gnupg/gpg.conf
auto-key-locate wkd,dane,local
auto-key-retrieve
基於 DNS 的命名實體認證(“DANE”)是一種在 DNS 中釋出公鑰並使用 DNSSEC 簽名區域保護它們的方法。Web 金鑰目錄(“WKD”)是使用 HTTPS 查詢來達到相同目的的替代方法。當使用 DANE 或 WKD 查詢公鑰時,GnuPG 將分別驗證 DNSSEC 或 TLS 證書,然後才將自動檢索的公鑰新增到您的本地金鑰環中。
Kernel.org 釋出了所有擁有 kernel.org 賬戶的開發者的 WKD。一旦您在 gpg.conf 中進行了上述更改,您就可以自動檢索 Linus Torvalds 和 Greg Kroah-Hartman 的金鑰(如果您還沒有的話)
$ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
如果您有 kernel.org 帳戶,那麼您應該將 kernel.org UID 新增到您的金鑰中,以便 WKD 對其他核心開發者更有用。
信任網 (WOT) 與首次使用信任 (TOFU)¶
PGP 整合了一種稱為“信任網”的信任委託機制。其核心是試圖取代 HTTPS/TLS 世界中對集中式認證機構的需求。PGP 不再由各種軟體製造商來決定誰應該是您信任的認證實體,而是將這項責任留給每個使用者。
不幸的是,很少有人理解信任網的工作原理。雖然它仍然是 OpenPGP 規範的一個重要方面,但 GnuPG 的最新版本(2.2 及以上)已經實現了一種名為“首次使用信任”(TOFU)的替代機制。您可以將 TOFU 理解為“類似於 SSH 的信任方法”。對於 SSH,您首次連線到遠端系統時,其金鑰指紋會被記錄並記住。如果金鑰將來發生更改,SSH 客戶端將提醒您並拒絕連線,強制您決定是否選擇信任更改後的金鑰。類似地,您首次匯入某人的 PGP 金鑰時,它被假定為有效。如果將來 GnuPG 在任何時候遇到具有相同身份的另一個金鑰,之前匯入的金鑰和新金鑰都將被標記為無效,您將需要手動確定保留哪一個。
我們建議您使用組合的 TOFU+PGP 信任模型(這是 GnuPG v2 中的新預設設定)。要設定它,請在 ~/.gnupg/gpg.conf 中新增(或修改)trust-model 設定
trust-model tofu+pgp
使用 kernel.org 信任網倉庫¶
Kernel.org 維護著一個包含開發者公共金鑰的 git 倉庫,以取代過去幾年大多已停用的金鑰伺服器網路。有關如何將該倉庫設定為公共金鑰來源的完整文件可以在這裡找到
如果您是核心開發者,請考慮提交您的金鑰以包含在該金鑰環中。