GPG 密钥生成与 Git 签名配置

GPG 是我们实际使用的软件。它的核心逻辑是:一把公钥(给人),一把私钥(自己留着)

我们分 5 步走:安装 -> 生成 -> 备份 -> 配置 Git -> 上传 GitHub。

第一步:安装 GPG

根据你的操作系统,使用包管理器安装。

  • MacOS (推荐):

    Bash

    brew install gnupg pinentry-mac

    (注:这里多装了一个 pinentry-mac,它是用来弹窗输入密码的,能完美解决你之前那个 “No such file” 的报错)

  • Linux (Ubuntu/Debian):

    Bash

    sudo apt install gnupg

第二步:生成全新的密钥对

不要用简单的 --gen-key,我们要用 --full-generate-key 来获得更多控制权(比如加密算法和有效期)。

在终端输入:

Bash

gpg --full-generate-key

接下来的交互式选择(按我的推荐选):

  1. 加密算法:

    • 会问你选哪种。推荐选 (1) RSA and RSA 或者 (9) ECC and ECC (Ed25519)。

    • 建议:ECC (Ed25519) (通常是选项 9)。它比 RSA 更短、更快、更安全。GitHub 完全支持。

  2. 椭圆曲线:

    • 如果选了 ECC,默认选 Curve 25519 即可。
  3. 有效期:

    • 问你密钥多久过期。千万不要选 0 (永不过期),这不安全。

    • 输入 2y (2年后过期),到时候可以续期。

  4. 个人信息 (非常重要):

    • Real name: 输入你的名字(如 Weijun Li)。

    • Email address: 必须和你 Git 配置 (git config user.email) 以及 GitHub 账号里的邮箱完全一致

    • Comment: 可以留空,或者写备注(如 Work Laptop)。

  5. Passphrase (密码):

    • 它会弹窗让你设一个密码。这个密码保护你的私钥,以后每次提交代码都要输,请务必记住。

第三步:配置 GPG 代理 (解决之前的报错)

这是最关键的一步,为了防止出现 signing failed: No such file or directory

我们需要告诉 GPG 用哪个程序来输入密码,并绑定终端。

1. 配置 gpg-agent.conf

在终端运行以下命令,自动写入配置:

Bash

# 创建目录(如果不存在)
mkdir -p ~/.gnupg

# 告诉 GPG 使用 pinentry-mac (MacOS用户)
# 如果你是 Linux,通常不需要这行,或者路径不同
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf

# 强制杀死后台进程以应用配置
gpgconf --kill gpg-agent

2. 配置环境变量 (Zsh)

把你之前可能漏掉的环境变量加到 Zsh 配置文件中。执行:

Bash

echo 'export GPG_TTY=$(tty)' >> ~/.zshrc
source ~/.zshrc

第四步:将公钥告诉 Git 和 GitHub

1. 找到你的 Key ID

Bash

gpg --list-secret-keys --keyid-format=long

输出里 sec 这一行,ed25519/ 后面的那串字符就是 ID。例如:

sec ed25519/473722E5E60EB8A8 ...

你的 ID 就是 473722E5E60EB8A8

2. 告诉 Git 使用这个 Key

Bash

# 设置你的 Key ID
git config --global user.signingkey 473722E5E60EB8A8

# 告诉 Git 所有的 commit 都要签名 (可选,但推荐)
git config --global commit.gpgsign true

# 告诉 Git GPG 程序在哪里
git config --global gpg.program $(which gpg)

3. 导出公钥给 GitHub

Bash

gpg --armor --export 473722E5E60EB8A8

复制输出的所有内容(包括 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头和结尾)。

  • 去 GitHub -> Settings -> SSH and GPG keys -> New GPG Key。

  • 粘贴进去,保存。

第五步:验证与备份 (最后一步)

1. 测试提交

找个仓库试一下:

Bash

git commit --allow-empty -m "test signed commit"

如果弹出一个漂亮的 macOS 原生密码框,或者在终端里让你输入密码,并且成功提交,那就大功告成了!

2. 备份私钥 (救命用的)

电脑可能会丢,系统可能会重装。如果没有备份私钥,你的身份就丢失了。

Bash

# 导出私钥到文件 (妥善保管这个文件,别传网盘!)
gpg --export-secret-keys --armor 473722E5E60EB8A8 > my-private-key.asc

my-private-key.asc 存到加密的 USB 或 1Password/Bitwarden 的安全笔记里。

总结

现在你已经拥有了一个标准的 GPG 环境:

  1. GPG Key:那是你的数字身份证。

  2. Git Config:Git 知道用这张身份证盖章。

  3. GPG Agent:负责在盖章时安全地问你要密码。

  4. GitHub:存了你的公钥,用来验证那是你本人提交的代码(会显示绿色的 Verified 标)。

下一步:

现在你可以去你的仓库执行 git commit 试试看了。如果还报错,把报错信息发给我,通常只剩下密码输入框弹出失败这一个坑了。