我從 2020 年開始就一直在為我的 Git 提交簽名,這似乎是一項可選的安全措施,直到你意識到有人冒充你是多麼容易。 GitHub 提交簽名使用GPG(GNU 隱私衛士)以加密方式證明你(且只有你)進行了提交。
任何人都可以設定他們的 git 配置,使用你的名字和郵箱,推送提交,這些提交就會顯示在 GitHub 上,就像你寫的一樣。真的。唯一的差別是什麼?沒有「已驗證」徽章。
GPG(GNU Privacy Guard)是 OpenPGP 標準的開源實現,用於加密和簽署資料。它通常用於加密電子郵件和文件,但也非常適合用於簽署 Git 提交。使用 GPG 簽名提交時,您將建立一個加密簽名,以證明提交來自有權存取您私鑰的人,而不僅僅是知道您的姓名和電子郵件地址的人。
如果您想深入了解 OpenPGP 標準,請查看官方 OpenPGP 規範。
提交模擬並非只是理論上的。以下是一些實際應用場景:
開源貢獻:有人可能使用核心維護者的身分提交惡意提交,使其看起來像是受信任的程式碼
工作環境:具有儲存庫存取權限的攻擊者可能會以您的身分提交程式碼,這可能會讓您因錯誤或安全問題而受到指責
審計線索:在受監管的行業中,能夠以加密方式證明誰提交了哪些程式碼對於合規性至關重要
供應鏈攻擊:攻擊者冒充開發人員,將惡意程式碼注入廣泛使用的程式庫中,影響數千個下游專案
「已驗證」徽章不僅僅是裝飾性的。它證明提交確實來自金鑰持有者,而不是某個冒充者。
說實話?大多數開發人員不會在每次提交時檢查驗證徽章。
但係統會關心。組織可以透過分支保護規則要求提交簽名。受監管的行業需要它們來確保合規。安全工具會標記沒有簽署的儲存庫。當供應鏈攻擊發生時,簽署的提交是證明其合法性的唯一方法。
這就像 10 年前的 HTTPS 一樣。它一直是可選的,直到它不再是可選的。
你不是在為今天做準備,而是在為重要時刻做準備。
本教學主要在 macOS 上使用 GPG Keychain (GPG Suite的一部分),它提供了一個美觀的 GUI 用於金鑰管理。如果您使用的是 Linux 或 Windows,概念相同,但需要使用不同的工具:
Linux :使用gpg命令列工具(通常已預先安裝)
Windows :如果使用Windows Subsystem for Linux (WSL),請嘗試Gpg4win或 Linux 方式。
所有平台上的 git 設定步驟相同。假設您擁有 GitHub 帳戶,大約需要 15 分鐘。
前往gpgtools.org下載 GPG Suite。它包含 GPG Keychain,它為你提供了一個視覺化的介面來管理金鑰,而無需你費力地使用命令列工具。
像安裝其他 Mac 應用程式一樣安裝它。
開啟 GPG Keychain,點擊「新建」即可建立金鑰對。

填寫:
姓名:您的真實姓名(應與您的 GitHub 帳戶一致)
電子郵件:與您的 GitHub 帳戶關聯的電子郵件
密碼:選擇一個強密碼。每次簽署提交時都需要它。
重要設定:
我將密鑰設定為 1 年後過期。這是一個很好的安全措施。如果你的金鑰被盜用,它最終會變得毫無用處。你可以在密鑰到期時隨時延長有效期限。
確保金鑰類型為 RSA 且至少為 4096 位元以確保良好的安全性。
點擊“生成密鑰”並等待幾秒鐘。

⚠️ 備份你的私鑰
密碼短語可以保護您的私鑰,但它並非備份。如果您遺失了私鑰檔案本身(例如在電腦當機或重裝時),即使知道密碼短語也無濟於事。沒有私鑰文件,即使您記得密碼短語,也無法簽署新的提交。
>
良好的備份選項:
- 匯出你的私鑰(
gpg --export-secret-keys --armor YOUR_KEY_ID > private-key.asc)並將其作為安全筆記儲存在密碼管理器(例如 1Password 或 Bitwarden)中。請注意,你很可能會收到密碼提示。
將整個
~/.gnupg目錄備份到加密雲端存儲將加密副本保存在安全的外部磁碟機上
>
無論您選擇哪種方法,請確保它是加密的並且只有您可以存取。
在 GPG 鑰匙圈中,選擇您的新金鑰,然後從選單中轉到匯出(或右鍵單擊該金鑰)。
確保未選取“在匯出的檔案中包含密鑰”並將其保存在某處。

在文字編輯器中開啟該文件。它看起來應該像這樣:
-----BEGIN PGP PUBLIC KEY BLOCK-----
[bunch of random-looking characters]
-----END PGP PUBLIC KEY BLOCK-----
複製整個區塊。
前往 GitHub → 設定 → SSH 和 GPG 金鑰
點選“新建 GPG 金鑰”
貼上你的公鑰
點擊“新增 GPG 金鑰”

GitHub 現在知道您的公鑰並可以驗證使用您的私鑰簽署的提交。
打開終端機並執行以下命令:
首先,取得您的金鑰 ID:
gpg --list-secret-keys --keyid-format=long
您將看到如下輸出:
sec rsa4096/ABC123DEF456 2022-01-15 [SC] [expires: 2026-01-15]
ABC123DEF456部分是您的密鑰 ID。
現在配置 git:
# Tell git which key to use (replace with your actual key ID)
git config --global user.signingkey ABC123DEF456
# Tell git to sign all commits by default
git config --global commit.gpgsign true
# Tell git where GPG is located (for macOS)
git config --global gpg.program /usr/local/bin/gpg
如果您想驗證您的配置:
git config --global --list | grep gpg
git config --global --list | grep signingkey
您應該看到:
commit.gpgsign=true
user.signingkey=ABC123DEF456
gpg.program=/usr/local/bin/gpg
建立測試提交:
git commit --allow-empty -m "Testing GPG signing"
git log --show-signature -1
你應該在輸出中看到“Good signature”。如果你將它推送到 GitHub,你會在你的提交旁邊看到一個可愛的「Verified」標記。
注意:首次使用 GPG 金鑰提交時,系統會要求您輸入密碼並將其新增至 Apple 鑰匙圈。這很正常,這可以避免每次都提示您輸入密碼。
當您的金鑰即將到期時,GPG Keychain 可以輕鬆進行續訂:
打開 GPG 鑰匙串
選擇您的金鑰
雙擊打開關鍵詳細訊息
點擊到期日旁邊的更改...按鈕


您無需在 GitHub 上更新任何內容。金鑰 ID 保持不變,因此 git 和 GitHub 可以繼續工作而無需進行任何更改。
這通常意味著:
GPG 找不到您的金鑰:使用gpg --list-secret-keys仔細檢查您的金鑰 ID
密碼問題:您的密碼提示可能被隱藏了。請嘗試執行echo "test" | gpg --clearsign來觸發它。
錯誤的 GPG 路徑:確保git config --global gpg.program指向正確的位置
在 macOS 上,如果您透過 GPG 工具安裝,路徑應該是/usr/local/bin/gpg 。
這意味著 git 正在尋找一個不存在的鍵。執行:
gpg --list-secret-keys
確保 git 配置中的金鑰 ID 與列出的金鑰之一相符。
檢查:
你的 git 配置中的電子郵件與你的 GPG 金鑰上的電子郵件相符
該電子郵件已在您的 GitHub 帳戶中驗證
您已將公鑰上傳至 GitHub
設定大約需要 15 分鐘,但一旦配置完成,您就無需再費心了。您的每次提交都會自動簽名,並且您將獲得驗證徽章,證明這確實是您的程式碼。
如果你在開源專案上工作,或者在程式碼來源至關重要的環境中工作,簽名提交就不是可選的,而是必須的。不妨趁現在還在考慮的時候就設定一下。
如果您發現這有幫助或遇到任何問題,請在評論中告訴我!
如果您想保持聯繫,我的所有社交活動都在nickyt.online 。
直到下一個!
原文出處:https://dev.to/nickytonline/anyone-can-commit-code-as-you-on-github-heres-how-to-stop-them-2in7