Git 如何配置 GPG 签名验证 commit 安全性

文章导读
Git 配置 GPG 签名验证 commit 安全性需要通过生成 GPG 密钥、配置 Git 用户签名密钥并启用自动签名选项来实现。该方案适用于需要审计提交者身份、防止代码仓库被篡改的团队或个人项目,风险边界在于私钥泄露会导致签名被冒用。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Git 配置 GPG 签名验证 commit 安全性需要通过生成 GPG 密钥、配置 Git 用户签名密钥并启用自动签名选项来实现。该方案适用于需要审计提交者身份、防止代码仓库被篡改的团队或个人项目,风险边界在于私钥泄露会导致签名被冒用。

先说结论:Git 支持通过 GPG 密钥对 commit 进行加密签名,验证提交者身份的真实性。

  • 适合:开源项目维护、企业代码审计、防止提交历史被伪造的场景
  • 先准备:安装 GPG 工具、生成密钥对、将公钥上传至代码托管平台
  • 验收:执行 git log `--show-signature` 看到 Good signature 字样

命令速用版

# 生成 GPG 密钥
gpg `--full-generate-key`

# 查看密钥 ID
gpg `--list-secret-keys` `--keyid-format` LONG

# 配置 Git 使用指定密钥
git config `--global` user.signingkey <KEY_ID>

# 启用自动签名
git config `--global` commit.gpgsign true

为什么会这样

Git 默认只记录提交者邮箱和名字,这些信息可以被轻易伪造,GPG 签名利用非对称加密技术为每次提交生成数字签名。

验证方使用提交者的公钥解密签名,若解密成功且哈希值匹配,则证明提交确实由持有私钥的人发起且内容未被修改。

分步处理

步骤 1:生成 GPG 密钥对

在终端运行 gpg `--full-generate-key`,按提示选择密钥类型(默认 RSA)和有效期,输入姓名和邮箱需与 Git 配置一致。

Git 如何配置 GPG 签名验证 commit 安全性

步骤 2:获取密钥 ID

运行 gpg `--list-secret-keys` `--keyid-format` LONG,复制 sec 行中斜杠后的 16 进制字符串作为密钥 ID。

步骤 3:配置 Git

使用 git config `--global` user.signingkey <KEY_ID> 绑定密钥,使用 git config `--global` commit.gpgsign true 开启自动签名。

步骤 4:上传公钥

Git 如何配置 GPG 签名验证 commit 安全性

运行 gpg `--armor` `--export` <KEY_ID> 导出公钥,将其粘贴到 GitHub 或 GitLab 设置页面的 GPG keys 区域。

怎么验证是否生效

本地验证运行 git log `--show-signature`,提交记录旁显示 gpg 签名信息且状态为 Good signature 即生效。

远程验证推送代码后,查看 GitHub 或 GitLab 仓库的 Commits 列表,已签名的提交会显示 Verified 绿色标记。

常见坑

密钥过期会导致签名验证失败,生成密钥时建议设置合理有效期或定期更新。

Git 如何配置 GPG 签名验证 commit 安全性

Git 配置的用户邮箱必须与 GPG 密钥中的邮箱完全一致,否则托管平台无法关联验证。

私钥密码每次签名都可能要求输入,可通过 gpg-agent 配置缓存策略减少干扰。

常见问题

Git 提交时提示 gpg failed to sign the data 怎么办

检查 GPG 工具是否正确安装以及 Git 配置的密钥 ID 是否存在,确认 gpg-agent 正在运行。

更换电脑后如何恢复签名能力

需要从安全备份中导出私钥并导入新环境的 GPG 密钥环,不能仅依靠代码托管平台的公钥。

如何对旧提交补签签名

旧提交无法直接补签,需使用 git filter-branch 或 git filter-repo 重写历史,这会改变提交哈希。

参考来源

  • Git SCM - Signing Your Work: https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work
  • GitHub Docs - About commit signature verification: https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification