•
GPG 金鑰名稱與電子郵件變更:從基本操作到專業身份過渡完整指南
24 分鐘閱讀 •
我在七月初更換了 email,從原本的 Gmail 更換為個人網域 Jim@ChenJ.im。在更換 GitHub 郵件地址之後連帶的也得更換 Git 簽章用的 GPG Key。
這麼多年來我還是第一次更換 GPG Key,說實話這些知識不曉得會不會用上第二次...
GPG 是歷史悠久的技術,理論上不需要參考資料 LLM 也會有足夠的知識能回答問題。於是,有頭腦但不擅搜尋的 Claude 就派上用場了。
注意!不要按照這一節直接變更原本的金鑰,請繼續往後閱讀。
1. 編輯 GPG 金鑰
首先,使用你的金鑰 ID 來編輯金鑰:
gpg --edit-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
2. 在 GPG 互動模式中執行以下操作
進入編輯模式後,你會看到 gpg>
提示符。執行以下命令:
新增新的使用者 ID
adduid
系統會提示你輸入:
- Real name: 輸入
Jim Chen
- Email address: 輸入
Jim@ChenJ.im
- Comment: 可以直接按 Enter 跳過
- 然後輸入
O
確認
設定新的 UID 為主要身份
uid 2
(選擇新建立的 UID,通常是第二個)
primary
(將選中的 UID 設為主要身份)
刪除舊的 UID(可選)
uid 1
(選擇舊的 UID)
deluid
(刪除選中的 UID)
儲存變更
save
3. 驗證變更
執行以下命令確認變更:
gpg --list-keys
你應該會看到新的名稱和電子郵件地址。
4. 更新 Git 設定
如果你使用這個金鑰來簽署 Git 提交,記得更新你的 Git 設定:
git config --global user.name "Jim Chen"
git config --global user.email "Jim@ChenJ.im"
5. 重新上傳公鑰(如果需要)
如果你有將公鑰上傳到金鑰伺服器,需要重新上傳:
gpg --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
這樣就完成了 GPG 金鑰名稱和電子郵件的修改。
負面影響
1. 歷史提交驗證問題
- 之前用舊身份簽署的提交可能會顯示為「未驗證」狀態
- 即使是同一把金鑰,但身份資訊不符,GitHub 可能無法正確驗證舊提交
- 這會影響提交歷史的完整性顯示
2. 身份追蹤困難
- 其他開發者可能無法識別新舊身份是同一人
- Code review 和 blame 功能可能會產生混淆
- 專案協作時可能需要額外解釋身份變更
3. 金鑰伺服器同步問題
- 如果你有上傳到公開金鑰伺服器,需要重新上傳
- 其他人可能仍然使用舊的身份資訊
4. 信任關係重建
- 如果有其他人簽署過你的舊金鑰,需要重新建立信任關係
- PGP 信任網路中的連結可能需要更新
GitHub 公鑰處理建議
建議:保留舊的,同時新增新的
原因:
- 向後相容性:舊的公鑰可以繼續驗證歷史提交
- 平滑過渡:給一段時間讓所有系統適應新身份
- 避免驗證中斷:確保所有提交都能正確驗證
具體操作步驟
先新增新的公鑰:
gpg --armor --export 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
在 GitHub Settings > SSH and GPG keys 中新增
保留舊公鑰一段時間(建議 3-6 個月)
更新 Git 設定:
git config --global user.signingkey 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
在專案中公告身份變更
確認新提交都用新身份簽署後,再考慮移除舊公鑰
最佳實踐建議
替代方案:建立新金鑰
如果你特別在意身份一致性,可以考慮:
- 建立全新的 GPG 金鑰對
- 使用新金鑰進行未來的簽署
- 保留舊金鑰僅用於驗證歷史提交
漸進式移除舊身份
# 在 GPG 編輯模式中,可以先設定舊 UID 為非主要
gpg --edit-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
# 選擇舊 UID 後執行 revuid(撤銷)而非直接刪除
這樣可以保持金鑰的連續性,同時明確表示身份變更。
revuid 的概念
revuid
(revoke user ID) 是撤銷使用者身份,而非刪除。這會:
- 在身份上標記為「已撤銷」
- 保留歷史記錄和驗證能力
- 向外界明確表示此身份不再使用
完整的最佳實踐流程
步驟 1: 建立新的 GPG 金鑰對
# 產生新金鑰
gpg --full-generate-key
選擇:
- 金鑰類型: RSA and RSA 或 ECC and ECC
- 金鑰大小: 4096 bits (RSA) 或 Curve 25519 (ECC)
- 有效期限: 建議設定 2-4 年
- 姓名: Jim Chen
- 電子郵件: Jim@ChenJ.im
步驟 2: 在舊金鑰上撤銷舊身份
# 編輯舊金鑰
gpg --edit-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
# 在 gpg> 提示符中:
uid 1 # 選擇舊的 UID
revuid # 撤銷此 UID
y # 確認撤銷
# 選擇撤銷原因(通常選擇 "User ID is no longer valid")
save # 儲存變更
步驟 3: 建立過渡聲明
建立一個簽署聲明文件來證明新舊金鑰的關係:
# 建立過渡聲明檔案
cat > key-transition.txt << 'EOF'
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
I am transitioning from my old GPG key to a new one.
Old key:
Key ID: 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
User ID: CHEN, CHUN <jim60105@gmail.com>
New key:
Key ID: [NEW_KEY_ID]
User ID: Jim Chen <Jim@ChenJ.im>
This transition is effective from [DATE].
All future communications will be signed with the new key.
Please update your records accordingly.
Jim Chen
EOF
# 用舊金鑰簽署這個聲明
gpg --default-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF --clearsign key-transition.txt
# 用新金鑰再次簽署
gpg --default-key [NEW_KEY_ID] --clearsign key-transition.txt.asc
步驟 4: 交叉簽署(Cross-signing)
# 用舊金鑰簽署新金鑰
gpg --default-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF --sign-key [NEW_KEY_ID]
# 用新金鑰簽署舊金鑰(可選)
gpg --default-key [NEW_KEY_ID] --sign-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
步驟 5: 更新 Git 設定
# 更新 Git 使用新金鑰
git config --global user.name "Jim Chen"
git config --global user.email "Jim@ChenJ.im"
git config --global user.signingkey [NEW_KEY_ID]
步驟 6: GitHub 上的處理
新增新公鑰:
gpg --armor --export [NEW_KEY_ID]
更新舊公鑰(上傳撤銷後的版本):
gpg --armor --export 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
在 GitHub 上保留兩把金鑰至少 6 個月
步驟 7: 公告和通知
- 在專案 README 或 CHANGELOG 中說明金鑰變更
- 發送過渡聲明給協作者
- 更新個人網站或簡介中的金鑰資訊
這種做法的優勢
1. 清晰的身份軌跡
- 撤銷標記清楚顯示身份變更時間點
- 保留完整的歷史驗證能力
- 符合 PGP 標準實踐
2. 安全性考量
- 新金鑰與舊身份完全隔離
- 如果舊金鑰有安全疑慮,可以完全停用
- 避免身份混淆的安全風險
3. 專業形象
- 遵循 PGP 社群的最佳實踐
- 為其他開發者提供清晰的過渡路徑
- 展現對資訊安全的專業態度
時程建議
第 0 天:建立新金鑰,撤銷舊身份
第 1-7 天:更新所有服務和設定
第 8-30 天:開始使用新金鑰簽署提交
第 31-180 天:同時保留兩把金鑰在 GitHub
第 181 天後:可考慮移除舊金鑰
這種做法雖然複雜,但能確保身份過渡的專業性和安全性。
什麼是交叉簽署(Cross-signing)
交叉簽署是指用你的舊金鑰簽署新金鑰,或用新金鑰簽署舊金鑰,來建立兩把金鑰之間的信任關係和身份連結。
為什麼需要交叉簽署
1. 建立身份連續性
- 向外界證明新舊金鑰屬於同一個人
- 在 PGP 信任網路中維持身份的一致性
- 避免他人質疑新金鑰的真實性
2. 傳承信任關係
- 如果有人信任你的舊金鑰,交叉簽署可以幫助建立對新金鑰的信任
- 在 PGP 信任網路中,這是正式的身份過渡方式
3. 防止身份冒用
- 只有擁有舊金鑰私鑰的人才能進行交叉簽署
- 這是一種強有力的身份證明機制
詳細實作步驟
準備工作
假設:
- 舊金鑰 ID:
1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
- 新金鑰 ID:
2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
步驟 1: 用舊金鑰簽署新金鑰
# 使用舊金鑰簽署新金鑰
gpg --default-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF --sign-key 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
系統會詢問:
- 你是否真的要簽署這個金鑰? (y/N)
- 你對這個金鑰的確認程度?
0
= 不回答1
= 我沒有檢查2
= 我做了一般檢查3
= 我做了非常仔細的檢查
建議選擇 3
,因為這是你自己的金鑰。
步驟 2: 用新金鑰簽署舊金鑰
# 使用新金鑰簽署舊金鑰
gpg --default-key 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0 --sign-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
步驟 3: 驗證簽署結果
# 檢查新金鑰的簽署狀況
gpg --list-sigs 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
# 檢查舊金鑰的簽署狀況
gpg --list-sigs 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
你應該會看到類似這樣的輸出:
pub ed25519 2024-11-05 [SC]
2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
uid [ultimate] Jim Chen <Jim@ChenJ.im>
sig 3 B1D5C039F1EDB5D0 2024-11-05 Jim Chen <Jim@ChenJ.im>
sig A0C4B928E0DCA4CF 2024-11-05 [User ID not found] <-- 舊金鑰的簽署
進階交叉簽署技巧
1. 本地簽署 vs 可匯出簽署
# 本地簽署(不會被匯出到金鑰伺服器)
gpg --default-key OLD_KEY --lsign-key NEW_KEY
# 可匯出簽署(會被匯出到金鑰伺服器)
gpg --default-key OLD_KEY --sign-key NEW_KEY
2. 設定簽署等級
# 互動式簽署,可以設定信任等級
gpg --default-key OLD_KEY --edit-key NEW_KEY
# 在 gpg> 提示符中輸入 sign
3. 建立帶有到期時間的簽署
# 建立會過期的簽署
gpg --default-key OLD_KEY --ask-cert-expire --sign-key NEW_KEY
建立正式的金鑰過渡聲明
# 建立詳細的過渡聲明
cat > key-transition-statement.txt << 'EOF'
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Key Transition Statement for Jim Chen
I am transitioning from my old GPG key to a new one. Both keys are
cross-signed to establish the connection between them.
Old key:
Key ID: 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
Key fingerprint: 1A88 67F6 CDB0 623A 0999 F463 A0C4 B928 E0DC A4CF
User ID: CHEN, CHUN <jim60105@gmail.com>
New key:
Key ID: 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
Key fingerprint: 2B99 78G7 DEC1 734B 1AAA 0574 B1D5 C039 F1ED B5D0
User ID: Jim Chen <Jim@ChenJ.im>
Cross-signatures:
- Old key has signed new key
- New key has signed old key
This transition is effective from [DATE].
Please:
1. Import both keys
2. Verify the cross-signatures
3. Update your records to use the new key for future communications
4. The old key will be revoked after 6 months
You can verify this transition by checking the cross-signatures:
gpg --check-sigs 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
gpg --check-sigs 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
Jim Chen
EOF
# 用舊金鑰簽署
gpg --default-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF --clearsign key-transition-statement.txt
# 用新金鑰重新簽署
gpg --default-key 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0 --clearsign key-transition-statement.txt.asc
上傳到金鑰伺服器
# 上傳包含交叉簽署的金鑰
gpg --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
gpg --send-keys 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
# 或指定特定的金鑰伺服器
gpg --keyserver keyserver.ubuntu.com --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
gpg --keyserver keyserver.ubuntu.com --send-keys 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
驗證交叉簽署
其他人可以這樣驗證你的金鑰過渡:
# 匯入兩把金鑰
gpg --recv-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
gpg --recv-keys 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
# 檢查交叉簽署
gpg --check-sigs 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
gpg --check-sigs 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0
# 驗證過渡聲明
gpg --verify key-transition-statement.txt.asc.asc
交叉簽署的安全考量
1. 私鑰安全
- 交叉簽署需要存取兩把金鑰的私鑰
- 確保在安全環境中進行
- 完成後立即安全儲存私鑰
2. 時效性
- 建議在金鑰過渡的早期階段完成交叉簽署
- 避免長時間延遲,以免影響信任關係
3. 撤銷準備
- 如果發現安全問題,準備好撤銷憑證
- 交叉簽署也可以被撤銷
交叉簽署是 PGP 生態系統中建立身份連續性的標準做法,能有效維護你在開發者社群中的身份信任。
GPG 金鑰的版本概念
重要概念:GPG 金鑰不是「版本」關係,而是同一把金鑰的不同狀態。
當你用新金鑰簽署舊金鑰時:
- 舊金鑰的金鑰 ID 和指紋完全不變
- 只是在舊金鑰上增加了一個新的簽署記錄
- 這仍然是同一把金鑰,只是內容更豐富了
實際操作建議
選項 1:更新舊金鑰(推薦)
# 匯出包含新簽署的舊金鑰
gpg --armor --export 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
在 GitHub 上:
- 刪除舊版本的舊金鑰
- 新增包含交叉簽署的舊金鑰
- 新增新金鑰
結果:你在 GitHub 上會有 2 把金鑰,不是 3 把
選項 2:保持簡潔(也可行)
如果你覺得交叉簽署在 GitHub 上不重要:
- 只保留舊金鑰的原始版本
- 新增新金鑰
- 不上傳包含交叉簽署的版本
為什麼交叉簽署在 GitHub 上不那麼重要
GitHub 的驗證機制
- GitHub 主要關心金鑰能否驗證提交
- 不會處理 PGP 信任網路的複雜關係
- 交叉簽署對 GitHub 的提交驗證沒有直接影響
交叉簽署的主要價值
- PGP 信任網路:在傳統 PGP 社群中建立信任關係
- 金鑰伺服器:讓其他 PGP 使用者驗證身份過渡
- 專業形象:展現對密碼學最佳實踐的了解
實務建議
如果你主要使用 GitHub
# 簡單做法:只保留乾淨的金鑰
在 GitHub 上:
├── 舊金鑰(原始版本)
└── 新金鑰
# 在金鑰伺服器上:
├── 舊金鑰(包含交叉簽署)
└── 新金鑰(包含交叉簽署)
如果你重視 PGP 生態系統
# 完整做法:GitHub 也使用交叉簽署版本
在 GitHub 上:
├── 舊金鑰(包含交叉簽署)
└── 新金鑰(包含交叉簽署)
# 在金鑰伺服器上:
├── 舊金鑰(包含交叉簽署)
└── 新金鑰(包含交叉簽署)
驗證交叉簽署是否有效
# 檢查舊金鑰是否包含新金鑰的簽署
gpg --list-sigs 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF | grep 2B9978G7
# 檢查新金鑰是否包含舊金鑰的簽署
gpg --list-sigs 2B9978G7DEC1734B1AAA0574B1D5C039F1EDB5D0 | grep 1A8867F6
時程規劃
第 1 階段(立即):
- 建立新金鑰
- 進行交叉簽署
- 上傳到金鑰伺服器
第 2 階段(1 週內):
- 在 GitHub 上新增新金鑰
- 決定是否更新舊金鑰版本
第 3 階段(1-6 個月):
- 觀察新金鑰的使用狀況
- 準備淘汰舊金鑰
第 4 階段(6 個月後):
- 可考慮從 GitHub 移除舊金鑰
- 保留在金鑰伺服器上以驗證歷史提交
總結:你不需要保留三把金鑰,最多只會有兩把(舊金鑰 + 新金鑰),交叉簽署只是在現有金鑰上增加資訊,不是創建新的金鑰。
什麼是 GPG 金鑰伺服器
GPG 金鑰伺服器是一個公開的服務,讓人們可以:
- 上傳自己的公開金鑰
- 搜尋並下載他人的公開金鑰
- 更新已上傳的金鑰資訊
- 撤銷不再使用的金鑰
想像它像是一個「公開的電話簿」,但存放的是加密金鑰而非電話號碼。
2025 年推薦的金鑰伺服器
我後來將交叉簽署完成的新金鑰上傳到了 keys.openpgp.org 伺服器
1. keys.openpgp.org(首選推薦)
這是目前最現代和可靠的金鑰伺服器
優點:
- 現代化的設計和維護
- 支援 HTTPS 加密傳輸
- 有 Web 介面可以直接上傳
- 嚴格的驗證機制(需要驗證電子郵件)
- 良好的隱私保護政策
使用方法:
# 上傳金鑰
gpg --keyserver keys.openpgp.org --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
# 搜尋金鑰
gpg --keyserver keys.openpgp.org --search-keys Jim@ChenJ.im
# 下載金鑰
gpg --keyserver keys.openpgp.org --recv-keys KEY_ID
2. keyserver.ubuntu.com(備選推薦)
這是由 Ubuntu 社群提供的公共服務
優點:
- 由 Ubuntu 維護,穩定性高
- 與 Linux 生態系統整合良好
- 支援 HKPS(加密連線)
使用方法:
# 上傳金鑰
gpg --keyserver keyserver.ubuntu.com --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
3. 避免使用的舊伺服器
SKS 金鑰伺服器網路已經被棄用,因為:
- 維護不善
- 安全性問題
- 不再發行新的 HKPS 憑證
上傳金鑰的好處
1. 身份驗證
- 其他開發者可以驗證你的身份
- 在開源專案中建立信任
- 證明你的提交確實來自你本人
2. 自動金鑰發現
- 其他人可以自動找到你的公開金鑰
- 支援 WKD(Web Key Directory)協議
- 簡化加密通訊的流程
3. 備份和恢復
- 公開金鑰有公開的備份
- 即使本地檔案遺失,也能重新取得
- 歷史版本的保存
4. 專業形象
- 展現對資訊安全的重視
- 符合開源社群的最佳實踐
- 提升在技術圈的專業度
實際操作步驟
步驟 1:設定預設金鑰伺服器
# 編輯 GPG 設定檔
nano ~/.gnupg/gpg.conf
# 添加以下內容:
keyserver keys.openpgp.org
keyserver-options auto-key-retrieve
步驟 2:上傳你的金鑰
# 上傳到主要伺服器
gpg --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
# 也可以上傳到備用伺服器
gpg --keyserver keyserver.ubuntu.com --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
步驟 3:驗證上傳結果
# 搜尋你的金鑰
gpg --search-keys Jim@ChenJ.im
# 或使用 Web 介面
# 訪問 https://keys.openpgp.org
# 搜尋你的電子郵件地址
步驟 4:設定電子郵件驗證(keys.openpgp.org)
keys.openpgp.org 要求驗證電子郵件:
- 上傳金鑰後,訪問 https://keys.openpgp.org
- 搜尋你的金鑰
- 點擊「Verify」按鈕
- 按照指示完成電子郵件驗證
隱私考量
上傳前考慮
- 公開金鑰會永久公開,無法完全刪除
- 你的姓名和電子郵件會變成公開資訊
- 可能會收到更多垃圾郵件
隱私保護措施
- 只上傳你確實想要公開的身份
- 考慮使用專門的技術電子郵件地址
- 定期更新金鑰的有效期限
維護你的金鑰
定期更新
# 更新金鑰的有效期限
gpg --edit-key 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
# 在 gpg> 提示符中輸入 expire
# 重新上傳更新後的金鑰
gpg --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
撤銷金鑰
# 如果金鑰被洩露,上傳撤銷憑證
gpg --import revoke.asc
gpg --send-keys 1A8867F6CDB0623A0999F463A0C4B928E0DCA4CF
建議的上傳策略
對於你的情況,我建議:
- 先上傳新金鑰到 keys.openpgp.org
- 完成電子郵件驗證
- 也上傳到 keyserver.ubuntu.com 作為備份
- 考慮是否上傳包含 revuid 的舊金鑰
這樣可以讓你在 GitHub 和更廣泛的開源社群中建立更可信的身份。
決策框架:是否上傳包含 revuid 的舊金鑰
考慮因素
1. 你的使用歷史
# 檢查你用舊金鑰簽署了多少提交
git log --show-signature --grep="GPG" --oneline | wc -l
# 或檢查特定專案的簽署提交
git log --show-signature --pretty=format:"%h %s" | grep -c "gpg"
建議:
- 如果有 大量簽署的提交:上傳舊金鑰
- 如果只有 少量或沒有簽署提交:可以不上傳
2. 你的公開程度
- 高度公開(維護開源專案、技術部落格):建議上傳
- 一般使用(只在公司或小團隊):可以不上傳
- 私人使用(只有個人專案):通常不需要上傳
3. 身份連續性的重要性
- 如果你希望其他開發者能追蹤你的身份變更:上傳
- 如果你想要乾淨的重新開始:不上傳
時序問題分析
「先上傳新金鑰」不會很奇怪
實際上,這種順序在 PGP 社群中很常見:
1. 漸進式身份管理
常見的身份過渡時序:
第1天:建立新金鑰 → 上傳新金鑰
第2-7天:設定新環境,開始使用新金鑰
第8-14天:處理舊金鑰(revuid),決定是否上傳
第15天後:如果需要,上傳包含 revuid 的舊金鑰
2. 技術上完全合理
- 金鑰伺服器不會檢查「創建時間」vs「上傳時間」
- PGP 標準允許任何時候上傳金鑰
- 很多人都是「用了一段時間才想到要上傳」
3. 實際場景類比
就像:
- 你可能用 GitHub 很久才設定 GPG 簽署
- 你可能寫了很多程式碼才開始寫文件
- 你可能工作很久才更新 LinkedIn 個人資料
推薦的決策流程
步驟 1:評估你的需求
# 分析你的 Git 歷史
git log --pretty=format:"%h %an %ae %s" --show-signature | head -20
# 檢查你在 GitHub 上的活躍程度
# 查看你的 contributions、followers、starred repos
步驟 2:根據情況選擇策略
策略 A:完整的專業過渡(推薦給活躍開發者)
# 1. 上傳新金鑰
gpg --send-keys [NEW_KEY_ID]
# 2. 在舊金鑰上執行 revuid
gpg --edit-key [OLD_KEY_ID]
# revuid 舊的 UID
# 3. 執行交叉簽署
gpg --sign-key [NEW_KEY_ID] # 用舊金鑰簽新金鑰
gpg --default-key [NEW_KEY_ID] --sign-key [OLD_KEY_ID] # 用新金鑰簽舊金鑰
# 4. 上傳更新後的舊金鑰
gpg --send-keys [OLD_KEY_ID]
# 5. 建立過渡聲明
策略 B:簡潔的個人過渡(推薦給一般使用者)
# 1. 上傳新金鑰
gpg --send-keys [NEW_KEY_ID]
# 2. 本地保留舊金鑰但不上傳
# 舊金鑰仍可用於驗證歷史提交
# 3. 在 GitHub 上保留舊金鑰用於驗證
策略 C:乾淨重新開始(推薦給想要全新身份的人)
# 1. 上傳新金鑰
gpg --send-keys [NEW_KEY_ID]
# 2. 不處理舊金鑰的 revuid
# 3. 逐步停用舊金鑰
時序最佳實踐
推薦的時程
第 1-3 天:設定新環境
├── 建立新金鑰
├── 上傳新金鑰到伺服器
├── 在 GitHub 新增新金鑰
└── 更新 Git 設定
第 4-7 天:觀察期
├── 用新金鑰簽署新提交
├── 確認一切運作正常
└── 決定舊金鑰的處理方式
第 8-14 天:處理舊金鑰(如果需要)
├── 執行 revuid
├── 交叉簽署
├── 上傳更新後的舊金鑰
└── 建立過渡聲明
第 15 天後:清理
├── 確認所有服務都使用新金鑰
└── 規劃舊金鑰的退役時程
給你的具體建議
基於你的情況(軟體工程師,有 GitHub 提交歷史),我建議:
如果你有多個公開的 GitHub 專案
- 有多個公開的 GitHub 專案
- 定期與其他開發者協作
- 重視專業形象
選擇策略 A(完整過渡)
如果你主要是個人開發
- 主要是個人開發或小團隊
- 不常與外部開發者協作
- 偏好簡潔的解決方案
選擇策略 B(簡潔過渡)
關於時序
「新金鑰先上傳」完全沒問題,甚至可以說是謹慎的做法:
- 先確保新金鑰可用
- 再決定如何處理舊金鑰
- 體現了漸進式的風險管理
這樣的順序在技術圈很常見,不會讓人覺得奇怪。
接下來這一句有特殊用意,我要它做一個總結並產出我的需求文件,目的是拿這個文件交棒給 GitHub Copilot。
換 GitHub Copilot 上場的原因是它可以使用我的 Command line
#runCommands
: 我可以用自然語言讓它代理我執行,又或者是讓它存取 command 輸出!😉