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 配置一致。
步骤 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:上传公钥
运行 gpg `--armor` `--export` <KEY_ID> 导出公钥,将其粘贴到 GitHub 或 GitLab 设置页面的 GPG keys 区域。
怎么验证是否生效
本地验证运行 git log `--show-signature`,提交记录旁显示 gpg 签名信息且状态为 Good signature 即生效。
远程验证推送代码后,查看 GitHub 或 GitLab 仓库的 Commits 列表,已签名的提交会显示 Verified 绿色标记。
常见坑
密钥过期会导致签名验证失败,生成密钥时建议设置合理有效期或定期更新。
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