All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chen-Yu Yeh <chenyou910331@gmail.com>
To: Alex Shi <alexs@kernel.org>, Jonathan Corbet <corbet@lwn.net>
Cc: Weijie Yuan <wy@wyuan.org>, Dongliang Mu <dzm91@hust.edu.cn>,
	Yanteng Si <si.yanteng@linux.dev>,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	Chen-Yu Yeh <chenyou910331@gmail.com>
Subject: [PATCH 04/13] docs/zh_TW: process: add maintainer-pgp-guide.rst translation
Date: Fri,  6 Nov 2026 19:35:35 +0800	[thread overview]
Message-ID: <20261106113545.708896-5-chenyou910331@gmail.com> (raw)
In-Reply-To: <20261106113545.708896-1-chenyou910331@gmail.com>

Translate Documentation/process/maintainer-pgp-guide.rst into
Traditional Chinese from the current English text, including the
GnuPG 2.4 requirement, the Nitrokey 3 entry, the B4 note on patatt and
the updated kernel.org documentation links.  The zh_CN translation was
consulted for wording only.

List the new file in the toctree of process/index.rst, after
coding-style as in the English index, and drop it from the TODOList.

update to commit 4a0be1a25d98 ("Documentation: process: Capitalize Git,
Quilt, and Mercurial consistently")

Signed-off-by: Chen-Yu Yeh <chenyou910331@gmail.com>
---
 .../translations/zh_TW/process/index.rst      |   2 +-
 .../zh_TW/process/maintainer-pgp-guide.rst    | 795 ++++++++++++++++++
 2 files changed, 796 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/translations/zh_TW/process/maintainer-pgp-guide.rst

diff --git a/Documentation/translations/zh_TW/process/index.rst b/Documentation/translations/zh_TW/process/index.rst
index 7917fb96dd01..7b830c48942a 100644
--- a/Documentation/translations/zh_TW/process/index.rst
+++ b/Documentation/translations/zh_TW/process/index.rst
@@ -42,6 +42,7 @@
 
    programming-language
    coding-style
+   maintainer-pgp-guide
    email-clients
    applying-patches
    volatile-considered-harmful
@@ -49,7 +50,6 @@
 TODOList:
 
 * changes
-* maintainer-pgp-guide
 * backporting
 * adding-syscalls
 * botching-up-ioctls
diff --git a/Documentation/translations/zh_TW/process/maintainer-pgp-guide.rst b/Documentation/translations/zh_TW/process/maintainer-pgp-guide.rst
new file mode 100644
index 000000000000..34d920cb37cc
--- /dev/null
+++ b/Documentation/translations/zh_TW/process/maintainer-pgp-guide.rst
@@ -0,0 +1,795 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../disclaimer-zh_TW.rst
+
+:Original: Documentation/process/maintainer-pgp-guide.rst
+
+.. _tw_pgpguide:
+
+=======================
+核心維護者 PGP 指南
+=======================
+
+:作者: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
+
+本文件的對象是 Linux 核心開發者,特別是子系統維護者。內容是 Linux 基金會
+發布的、更通用的「`Protecting Code Integrity`_」指南中所討論資訊的一部分。
+若想更深入了解本指南提到的某些主題,請閱讀該文件。
+
+.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md
+
+PGP 在 Linux 核心開發中的角色
+=============================
+
+PGP 有助於確保 Linux 核心開發社群所產出程式碼的完整性,並在較小程度上,
+透過 PGP 簽名的電子郵件往來,在開發者之間建立可信任的通訊管道。
+
+Linux 核心原始碼主要以兩種形式提供:
+
+- 分散式原始碼儲存庫(Git)
+- 定期發布的快照(tarball)
+
+Git 儲存庫和 tarball 都帶有建立正式核心版本的核心開發者的 PGP 簽名。這些
+簽名提供密碼學上的保證,確保透過 kernel.org 或任何其他鏡像站提供下載的
+版本,與這些開發者工作站上的版本完全相同。為此:
+
+- Git 儲存庫的所有標籤都附有 PGP 簽名
+- tarball 的所有下載檔都附有分離式(detached)PGP 簽名
+
+.. _tw_devs_not_infra:
+
+信任開發者,而非基礎設施
+------------------------
+
+自從 2011 年 kernel.org 核心系統遭到入侵以來,Kernel Archives 專案的主要
+運作原則,就是假設基礎設施的任何部分都可能隨時遭到入侵。因此,管理員刻意
+採取措施,強調信任必須永遠放在開發者身上,而絕不放在程式碼託管基礎設施
+上,不論後者的安全實務做得多好。
+
+上述指導原則正是需要本指南的原因。我們希望確保,把信任放在開發者身上,並
+不只是把未來可能發生的安全事件的責任轉嫁給別人。本指南的目標是提供一套
+準則,讓開發者可以用來建立安全的工作環境,並保護用來確立 Linux 核心本身
+完整性的 PGP 金鑰。
+
+.. _tw_pgp_tools:
+
+PGP 工具
+========
+
+使用 GnuPG 2.4 或更新版本
+-------------------------
+
+你的發行版應該已經預設安裝了 GnuPG,你只需要確認你使用的是夠新的版本。
+要檢查版本,請執行::
+
+    $ gpg --version | head -n1
+
+如果你的版本是 2.4 或以上,那就沒問題了。如果版本更舊,表示你使用的
+GnuPG 版本已經不再維護,本指南中的某些指令可能無法運作。
+
+設定 gpg-agent 選項
+~~~~~~~~~~~~~~~~~~~
+
+GnuPG agent 是一個輔助工具,每當你使用 ``gpg`` 指令時就會自動啟動,並在
+背景執行,用途是快取私鑰的密碼短語。有兩個選項你應該知道,用來調整密碼
+短語何時從快取中失效:
+
+- ``default-cache-ttl`` (秒):如果你在存活時間(time-to-live)到期前再次
+  使用同一把金鑰,倒數計時會重設,重新計算一段時間。預設值為 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
+
+.. note::
+
+    現在已經不需要在 shell 工作階段開始時手動啟動 gpg-agent。你可能需要
+    檢查你的 rc 檔案,移除先前為舊版 GnuPG 所做的設定,因為它們可能已經
+    不再正確。
+
+.. _tw_protect_your_key:
+
+保護你的 PGP 金鑰
+=================
+
+本指南假設你已經有一把用於 Linux 核心開發的 PGP 金鑰。如果你還沒有,請
+參閱前面提到的「`Protecting Code Integrity`_」文件,了解如何建立新的金鑰。
+
+如果你目前的金鑰強度低於 2048 位元(RSA),你也應該建立一把新的金鑰。
+
+了解 PGP 子金鑰
+---------------
+
+PGP 金鑰很少只由單一金鑰對組成——通常它是一組彼此獨立的子金鑰,可依其
+建立時所指派的能力用於不同用途。PGP 定義了金鑰可以具備的四種能力:
+
+- **[S]** 金鑰可用於簽名
+- **[E]** 金鑰可用於加密
+- **[A]** 金鑰可用於身分驗證
+- **[C]** 金鑰可用於認證其他金鑰
+
+具備 **[C]** 能力的金鑰常被稱為「主」金鑰(master key),但這個說法容易
+造成誤解,因為它暗示認證金鑰可以取代同一條鏈上的任何其他子金鑰(就像實體
+的「萬能鑰匙」可以打開為其他鑰匙打造的鎖)。由於事實並非如此,本指南將它
+稱為「認證金鑰」(Certify key),以避免任何歧義。
+
+務必完全理解以下幾點:
+
+1. 所有子金鑰彼此完全獨立。如果你遺失了某把私有子金鑰,就無法從你鏈上的
+   任何其他私鑰還原或重新產生它。
+2. 除了認證金鑰之外,可以有多把能力相同的子金鑰(例如,你可以有 2 把有效
+   的加密子金鑰、3 把有效的簽名子金鑰,但只能有一把有效的認證子金鑰)。
+   所有子金鑰都完全獨立——加密給某一把 **[E]** 子金鑰的訊息,無法用你
+   可能擁有的任何其他 **[E]** 子金鑰解密。
+3. 單一子金鑰可以具備多種能力(例如,你的 **[C]** 金鑰也可以同時是你的
+   **[S]** 金鑰)。
+
+具備 **[C]** (認證)能力的金鑰,是唯一可以用來表示與其他金鑰之間關係的
+金鑰。只有 **[C]** 金鑰可以用來:
+
+- 新增或撤銷具備 S/E/A 能力的其他金鑰(子金鑰)
+- 新增、變更或撤銷與該金鑰關聯的身分(uid)
+- 新增或變更它自己或任何子金鑰的到期日
+- 為了信任網的目的簽署其他人的金鑰
+
+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
+
+備份你的認證金鑰以供災難復原
+----------------------------
+
+你的 PGP 金鑰上來自其他開發者的簽名越多,你就越有理由為了災難復原,建立
+一份存放在數位媒體以外的備份。
+
+要製作私鑰的可列印紙本,一個好方法是使用專為此目的撰寫的 ``paperkey``
+軟體。關於其輸出格式,以及它相較於其他方案的優點,請參閱
+``man paperkey``。大多數發行版應該都已經有 Paperkey 的套件。
+
+執行以下指令,建立私鑰的紙本備份::
+
+    $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
+
+把該檔案列印出來,然後拿一支筆,把你的密碼短語寫在紙張的邊緣。**強烈建議
+這麼做**,因為印出來的金鑰仍然是用該密碼短語加密的,而如果你哪天變更了
+密碼短語,你將不會記得建立備份時用的是哪一個——*保證如此*。
+
+把印好的紙本和手寫的密碼短語放進信封,存放在安全且受到妥善保護的地方,
+最好不在你家裡,例如銀行的保險箱。
+
+.. note::
+
+    金鑰仍然是用你的密碼短語加密的,所以即使用「整合雲端」的現代印表機
+    列印,也應該仍是相對安全的操作。
+
+備份你的整個 GnuPG 目錄
+-----------------------
+
+.. warning::
+
+    **!!!不要跳過這個步驟!!!**
+
+當你需要復原 PGP 金鑰時,手邊有一份隨時可用的備份是很重要的。這和我們用
+``paperkey`` 所做的災難等級準備不同。每當你需要使用認證金鑰時——例如變更
+你自己的金鑰,或在研討會和高峰會之後簽署其他人的金鑰——你也會依賴這些
+外部副本。
+
+首先,準備一張外接儲存卡(最好是兩張!)作為備份用途。你需要用 LUKS 在
+這個裝置上建立一個加密分割區——如何操作請參閱你的發行版文件。
+
+加密用的密碼短語可以和你的 PGP 金鑰使用同一個。
+
+加密程序完成後,重新插入你的裝置,並確認它已正確掛載。把你的整個
+``.gnupg`` 目錄複製到加密儲存裝置上::
+
+    $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
+
+現在你應該測試一下,確認一切仍然正常運作::
+
+    $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
+
+如果沒有出現任何錯誤,那就沒問題了。卸載裝置,清楚地標示它,以免不小心
+覆寫,然後把它放在安全的地方——但不要放得太遠,因為你偶爾還需要用它來
+做一些事,例如編輯身分、新增或撤銷子金鑰,或簽署其他人的金鑰。
+
+從主目錄中移除認證金鑰
+----------------------
+
+我們主目錄中的檔案,並沒有我們想像中受到那麼好的保護。它們可能透過許多
+不同的途徑外洩或被竊:
+
+- 為了設定新工作站而快速複製主目錄時意外外洩
+- 系統管理員的疏忽或惡意
+- 保護不周的備份
+- 桌面應用程式(瀏覽器、pdf 檢視器等)中的惡意軟體
+- 跨越國境時遭到脅迫
+
+用好的密碼短語保護金鑰,可以大幅降低上述任何一種風險,但密碼短語仍可能
+透過鍵盤側錄程式、偷窺螢幕或其他各種方式被發現。因此,建議的做法是把
+認證金鑰從主目錄中移除,存放在離線儲存裝置上。
+
+.. warning::
+
+    請參閱上一節,確認你已經完整備份了 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`` 目錄中所有的 ``secring.gpg`` 檔案,它們可能是
+舊版 GnuPG 留下來的。
+
+如果你沒有「private-keys-v1.d」目錄
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+如果你沒有 ``~/.gnupg/private-keys-v1.d`` 目錄,表示你的密鑰仍然儲存在
+GnuPG v1 所使用的舊式 ``secring.gpg`` 檔案中。對金鑰做任何變更,例如變更
+密碼短語或新增子金鑰,應該都會自動把舊的 ``secring.gpg`` 格式轉換為使用
+``private-keys-v1.d``。
+
+完成之後,務必刪除已過時的 ``secring.gpg`` 檔案,因為它仍然含有你的
+私鑰。
+
+.. _tw_smartcards:
+
+將子金鑰移到專用的加密裝置
+==========================
+
+雖然認證金鑰現在已經不會外洩或被竊,但子金鑰仍然在你的主目錄中。任何
+設法取得這些子金鑰的人,都能夠解密你的通訊或偽造你的簽名(如果他們知道
+密碼短語)。此外,每次執行 GnuPG 操作時,金鑰都會被載入系統記憶體,夠
+先進的惡意軟體可以從那裡把它們偷走(想想 Meltdown 和 Spectre)。
+
+要完整保護你的金鑰,一個好方法是把它們移到能夠執行智慧卡操作的專用硬體
+裝置上。
+
+智慧卡的好處
+------------
+
+智慧卡內含一顆加密晶片,能夠儲存私鑰,並直接在卡片上執行加密運算。由於
+金鑰內容永遠不會離開智慧卡,插入該硬體裝置的電腦,其作業系統無法取得私鑰
+本身。這和我們先前用於備份的加密儲存裝置大不相同——那個裝置在插入並掛載
+時,作業系統是能夠存取私鑰內容的。
+
+使用外接加密媒體並不能取代具備智慧卡功能的裝置。
+
+可用的智慧卡裝置
+----------------
+
+除非你所有的筆記型電腦和工作站都有智慧卡讀卡機,否則最簡單的做法是取得
+一個實作智慧卡功能的專用 USB 裝置。有幾種選擇:
+
+- `Nitrokey Start`_:開放硬體與自由軟體,以 FSI Japan 的 `Gnuk`_ 為
+  基礎。最便宜的選擇之一,但提供的安全功能最少(例如防竄改或抵抗某些
+  旁通道攻擊)。
+- `Nitrokey 3`_:與 Nitrokey Start 類似,但更能防竄改,並提供更多安全
+  功能和 USB 外形規格。支援 ECC 密碼學(ED25519 和 NISTP)。
+- `Yubikey 5`_:專有的硬體與軟體,但比 Nitrokey 便宜,功能也相近。支援
+  ECC 密碼學(ED25519 和 NISTP)。
+
+你的選擇將取決於成本、在你所在地區能否運送,以及對開放或專有硬體的考量。
+
+.. note::
+
+    如果你列在 MAINTAINERS 的 `M:` 項目中,或擁有 kernel.org 帳號,你就
+    `qualify for a free Nitrokey Start`_ (有資格免費獲得 Linux 基金會
+    提供的 Nitrokey Start)。
+
+.. _`Nitrokey Start`: https://www.nitrokey.com/products/nitrokeys
+.. _`Nitrokey 3`: https://www.nitrokey.com/products/nitrokeys
+.. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/
+.. _Gnuk: https://www.fsij.org/doc-gnuk/
+.. _`qualify for a free Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html
+
+設定你的智慧卡裝置
+------------------
+
+你的智慧卡裝置一插上任何現代的 Linux 工作站,就應該能直接運作(Just Work
+(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,所以如果不記錄下來,你一定會
+忘記它是什麼。
+
+回到卡片主選單後,你也可以設定其他值(例如姓名、性別、登入資料等),但這
+並非必要,而且萬一你遺失了智慧卡,還會額外洩漏關於這張智慧卡的資訊。
+
+.. note::
+
+    雖然名稱叫做「PIN」,但卡片上的使用者 PIN 和管理員 PIN 都不一定要是
+    數字。
+
+.. warning::
+
+    某些裝置可能要求你先把子金鑰移到裝置上,才能變更密碼短語。請查閱
+    裝置製造商提供的文件。
+
+將子金鑰移到你的智慧卡
+----------------------
+
+離開卡片選單(使用「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]** 金鑰,把它放進加密(Encryption)槽位是合理的。
+送出選擇後,系統會先要求你輸入 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]** 金鑰可以同時用於簽名(Signature)和身分驗證(Authentication),
+但我們希望確保它放在簽名槽位中,所以選擇(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`` 檔案都已經被替換成存根(stub)::
+
+    $ 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] 2038-07-01
+
+記得把更新後的金鑰發送回金鑰伺服器::
+
+    $ gpg --send-key [fpr]
+
+做了任何變更之後更新你的工作目錄
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+當你使用離線儲存裝置對金鑰做了任何變更之後,會需要把這些變更匯入回你平常
+的工作目錄::
+
+    $ gpg --export | gpg --homedir ~/.gnupg --import
+    $ unset GNUPGHOME
+
+透過 ssh 使用 gpg-agent
+~~~~~~~~~~~~~~~~~~~~~~~
+
+如果你需要在遠端系統上簽署標籤或提交,可以透過 ssh 轉送你的 gpg-agent。
+請參考 GnuPG wiki 上提供的說明:
+
+- `Agent Forwarding over SSH`_
+
+如果你能修改遠端的 sshd 伺服器設定,運作起來會更順暢。
+
+.. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding
+
+.. _tw_pgp_with_git:
+
+在 Git 中使用 PGP
+=================
+
+Git 的核心特色之一是它的分散式本質——一旦把儲存庫複製到你的系統上,你就
+擁有該專案的完整歷史,包括它所有的標籤、提交和分支。然而,當外面流傳著
+數以百計的複製儲存庫時,任何人要如何確認自己手上的 linux.git 副本沒有
+被惡意第三方竄改?
+
+又或者,如果在核心中發現了惡意程式碼,而提交中的「Author」行說是你做的,
+但你很確定自己 `跟它毫無關係`_,那又會怎樣?
+
+為了同時解決這兩個問題,Git 引入了 PGP 整合。簽名標籤可以確保儲存庫的
+內容與建立該標籤的開發者工作站上的內容完全相同,藉此證明儲存庫的完整性;
+而簽名提交則讓別人在無法取得你的 PGP 金鑰的情況下,幾乎不可能冒充你。
+
+.. _`跟它毫無關係`: https://github.com/jayphelps/git-blame-someone-else
+
+設定 Git 使用你的 PGP 金鑰
+--------------------------
+
+如果你的金鑰環中只有一把密鑰,那其實不需要做任何額外的事,因為它就會是你
+的預設金鑰。不過,如果你剛好有多把密鑰,可以告訴 Git 應該使用哪一把
+(``[fpr]`` 是你金鑰的指紋)::
+
+    $ git config --global user.signingKey [fpr]
+
+如何使用簽名標籤
+----------------
+
+要建立簽名標籤,請在 tag 指令加上 ``-s`` 選項::
+
+    $ git tag -s [tagname]
+
+我們建議一律簽署 Git 標籤,因為這能讓其他開發者確認他們拉取的 Git 儲存庫
+沒有遭到惡意竄改。
+
+如何驗證簽名標籤
+~~~~~~~~~~~~~~~~
+
+要驗證簽名標籤,請使用 ``verify-tag`` 指令::
+
+    $ git verify-tag [tagname]
+
+如果你是從專案儲存庫的另一個分叉拉取標籤,Git 應該會自動驗證你所拉取的
+最新端點上的簽名,並在合併操作期間顯示結果::
+
+    $ git pull [url] tags/sometag
+
+合併訊息中會包含類似以下的內容::
+
+    Merge tag 'sometag' of [url]
+
+    [Tag message]
+
+    # gpg: Signature made [...]
+    # gpg: Good signature from [...]
+
+如果你要驗證別人的 Git 標籤,首先需要匯入他們的 PGP 金鑰。請參閱下面的
+「:ref:`tw_verify_identities`」一節。
+
+設定 Git 一律簽署附註標籤
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+如果你要建立附註標籤(annotated tag),你很可能也會想要簽署它。要強制
+Git 一律簽署附註標籤,可以設定一個全域設定選項::
+
+    $ git config --global tag.forceSignAnnotated true
+
+如何使用簽名提交
+----------------
+
+你也可以建立簽名提交,但它們在 Linux 核心開發中的用處有限。核心的貢獻
+流程仰賴寄送修補程式,而把提交轉換成修補程式並不會保留 Git 提交簽名。
+此外,把你自己的儲存庫 rebase 到較新的上游版本時,PGP 提交簽名最後也會
+被捨棄。因此,大多數核心開發者並不費心簽署自己的提交,也會忽略他們工作
+所依賴的任何外部儲存庫中的簽名提交。
+
+話雖如此,如果你的工作用 Git 樹公開放在某個 Git 託管服務上(kernel.org、
+infradead.org、ozlabs.org 或其他),那麼即使上游開發者無法直接從這種做法
+中受益,我們仍建議你簽署所有的 Git 提交。
+
+我們建議這麼做的理由如下:
+
+1. 如果有一天需要進行程式碼鑑識或追查程式碼來源,即使是在外部維護、帶有
+   PGP 提交簽名的樹,對這類用途也很有價值。
+2. 如果你需要重新複製本地儲存庫(例如,重新安裝系統之後),這可以讓你在
+   繼續工作之前驗證儲存庫的完整性。
+3. 如果有人需要 cherry-pick 你的提交,這能讓他們在套用之前快速驗證這些
+   提交的完整性。
+
+建立簽名提交
+~~~~~~~~~~~~
+
+要建立簽名提交,請在 ``git commit`` 指令加上 ``-S`` 旗標(因為和另一個
+旗標衝突,所以是大寫的 ``-S``)::
+
+    $ git commit -S
+
+設定 Git 一律簽署提交
+~~~~~~~~~~~~~~~~~~~~~
+
+你可以告訴 Git 一律簽署提交::
+
+    git config --global commit.gpgSign true
+
+.. note::
+
+    在開啟這個選項之前,請務必先設定好 ``gpg-agent``。
+
+.. _tw_verify_identities:
+
+如何使用簽名修補程式
+--------------------
+
+你可以用 PGP 金鑰簽署發送到核心開發者郵件列表的修補程式。由於現有的電子
+郵件簽名機制(PGP-Mime 或 PGP-inline)往往會對一般的程式碼審查工作造成
+問題,你應該使用 kernel.org 為此目的建立的工具,它會把密碼學證明
+(attestation)簽名放進郵件標頭中(類似 DKIM):
+
+- `Patatt Patch Attestation`_
+
+.. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/
+
+安裝與設定 patatt
+~~~~~~~~~~~~~~~~~
+
+.. note::
+
+    如果你使用 B4 寄送修補程式,patatt 已經安裝好並整合進你的工作流程中。
+
+許多發行版都已經有 Patatt 的套件,所以請先到那裡找找看。你也可以用
+「``pip install patatt``」從 pypi 安裝。
+
+如果你已經在 Git 中設定好 PGP 金鑰(透過 ``user.signingKey`` 設定參數),
+那麼 patatt 不需要任何額外設定。你可以在想要的儲存庫中安裝 git-send-email
+掛鉤(hook),開始簽署你的修補程式::
+
+    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
+
+.. note::
+
+    Patatt 和 b4 仍在積極開發中,你應該查閱這些專案的最新文件,了解任何
+    新增或更新的功能。
+
+.. _tw_kernel_identities:
+
+如何驗證核心開發者的身分
+========================
+
+簽署標籤和提交很簡單,但要如何確認用來簽署某樣東西的金鑰,確實屬於那位
+核心開發者,而不是屬於惡意的冒名者?
+
+使用 WKD 和 DANE 設定自動擷取金鑰
+---------------------------------
+
+如果你還沒有大量收集其他開發者的公鑰,可以靠金鑰的自動探索與自動擷取來
+快速建立你的金鑰環。如果從零開始建立你自己的信任網(Web of Trust)讓你
+望而卻步,GnuPG 可以借助其他委派信任技術,也就是 DNSSEC 和 TLS,讓你
+先開始使用。
+
+把以下內容加到你的 ``~/.gnupg/gpg.conf``::
+
+    auto-key-locate wkd,dane,local
+    auto-key-retrieve
+
+基於 DNS 的具名實體認證(DNS-Based Authentication of Named Entities,
+「DANE」)是一種在 DNS 中發布公鑰,並使用 DNSSEC 簽名區域來保護它們的
+方法。Web 金鑰目錄(Web Key Directory,「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 對其他核心開發者更有用。
+
+.. _`把 kernel.org UID 加到你的金鑰`: https://korg.docs.kernel.org/mail.html#adding-a-kernel-org-uid-to-your-pgp-key
+
+信任網(WOT)與首次使用信任(TOFU)
+-----------------------------------
+
+PGP 包含一種稱為「信任網」(Web of Trust)的信任委派機制。其核心是試圖
+取代 HTTPS/TLS 世界中對集中式憑證授權單位(Certification Authority)的
+需求。PGP 不讓各家軟體廠商來決定誰應該是你信任的認證實體,而是把這個責任
+交給每一位使用者。
+
+可惜的是,很少有人了解信任網是如何運作的。雖然它仍是 OpenPGP 規範中重要
+的一部分,但較新版本的 GnuPG(2.2 及以上)已經實作了另一種稱為「首次使用
+信任」(Trust on First Use,TOFU)的機制。你可以把 TOFU 想成「類似 SSH 的
+信任方式」。使用 SSH 時,第一次連線到遠端系統,其金鑰指紋就會被記錄並
+記住。如果之後金鑰改變了,SSH 用戶端會警告你並拒絕連線,迫使你決定是否
+要信任改變後的金鑰。同樣地,第一次匯入某人的 PGP 金鑰時,它會被假定為
+有效。如果之後 GnuPG 在任何時候遇到另一把身分相同的金鑰,先前匯入的金鑰
+和新金鑰都會被標記為需要驗證,你必須手動判斷要保留哪一把。
+
+我們建議你使用合併的 TOFU+PGP 信任模型(這是 GnuPG v2 新的預設值)。要
+設定它,請在 ``~/.gnupg/gpg.conf`` 中新增(或修改)``trust-model``
+設定::
+
+    trust-model tofu+pgp
+
+.. _tw_kernel_org_trust_repository:
+
+使用 kernel.org 信任網儲存庫
+----------------------------
+
+Kernel.org 維護一個存放開發者公鑰的 Git 儲存庫,用來取代過去幾年大多已經
+停擺的同步式金鑰伺服器網路。關於如何把該儲存庫設定為你的公鑰來源,完整
+文件可以在這裡找到:
+
+- `Kernel developer PGP Keyring`_
+
+如果你是核心開發者,請考慮提交你的金鑰,讓它收錄到該金鑰環中。
+
+.. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html
-- 
2.43.0


  parent reply	other threads:[~2026-11-06 11:36 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06 11:35 [PATCH 00/13] docs/zh_TW: process: add translations of 13 documents Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 01/13] docs/zh_TW: process: add researcher-guidelines.rst translation Chen-Yu Yeh
2026-11-10 11:23   ` Weijie Yuan
2026-11-06 11:35 ` [PATCH 02/13] docs/zh_TW: process: add cve.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 03/13] docs/zh_TW: process: add applying-patches.rst translation Chen-Yu Yeh
2026-11-10 11:24   ` Weijie Yuan
2026-11-06 11:35 ` Chen-Yu Yeh [this message]
2026-11-10 11:24   ` [PATCH 04/13] docs/zh_TW: process: add maintainer-pgp-guide.rst translation Weijie Yuan
2026-11-06 11:35 ` [PATCH 05/13] docs/zh_TW: process: add changes.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 06/13] docs/zh_TW: process: add handling-regressions.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 07/13] docs/zh_TW: process: add deprecated.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 08/13] docs/zh_TW: process: add kernel-docs.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 09/13] docs/zh_TW: process: add maintainer-handbooks.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 10/13] docs/zh_TW: process: add contribution-maturity-model.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 11/13] docs/zh_TW: process: add conclave.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 12/13] docs/zh_TW: process: add threat-model.rst translation Chen-Yu Yeh
2026-11-06 11:35 ` [PATCH 13/13] docs/zh_TW: process: add maintainers.rst translation Chen-Yu Yeh
2026-11-10 11:22   ` Weijie Yuan
2026-11-07 12:44 ` [PATCH 00/13] docs/zh_TW: process: add translations of 13 documents Dongliang Mu
2026-11-08 10:13   ` Dongliang Mu
2026-11-09 13:11     ` 葉宸佑
2026-11-09 16:13       ` Weijie Yuan
2026-11-09 16:25     ` Weijie Yuan
2026-11-09 13:10   ` 葉宸佑

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261106113545.708896-5-chenyou910331@gmail.com \
    --to=chenyou910331@gmail.com \
    --cc=alexs@kernel.org \
    --cc=corbet@lwn.net \
    --cc=dzm91@hust.edu.cn \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=si.yanteng@linux.dev \
    --cc=wy@wyuan.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.