遇到 Git 提交签名 verification failed,通常是本地 Git 未配置正确的 GPG 密钥 ID,或者远程仓库缺少对应的公钥。优先检查本地密钥配置并同步公钥到代码托管平台。
先说结论:签名验证失败本质是信任链断裂,需确保本地私钥可用且远程平台信任对应的公钥。
- 先确认:检查本地 GPG 密钥列表及关联邮箱
- 先处理:将密钥 ID 写入 Git 配置并导出公钥
- 再验证:在远程仓库设置中添加公钥并查看提交状态
命令速用版
如果你需要快速恢复签名功能,可按顺序执行以下命令。注意将 <KEY_ID> 替换为你实际的密钥 ID。
# 1. 查看本地密钥 ID
gpg `--list-secret-keys` `--keyid-format` LONG# 2. 配置 Git 使用该密钥
git config `--global` user.signingkey <KEY_ID># 3. 开启提交自动签名(可选)
git config `--global` commit.gpgsign true# 4. 导出公钥用于上传
gpg `--armor` `--export` <KEY_ID>新手指南:如何生成 GPG 密钥
如果本地没有密钥,需要先生成。执行以下命令进入交互式生成流程:
gpg `--full-generate-key`按提示操作:
- 密钥类型:默认 RSA and RSA (1)
- 密钥长度:建议 4096
- 有效期:建议设置过期时间(如 1y),后续可续期
- 姓名和邮箱:必须与 Git 配置的 user.name 和 user.email 一致
为什么会这样
Git 的签名机制基于非对称加密。你在本地使用私钥对提交内容生成签名,而远程平台(如 GitHub、GitLab)或协作方的 Git 客户端使用公钥来验证这个签名是否合法。
出现 verification failed 通常有三种情况:一是本地 Git 不知道用哪个密钥签名;二是签名用的密钥与提交者邮箱不匹配;三是验证方没有导入你的公钥,无法建立信任。这不代表代码内容被篡改,只是身份无法被 cryptographic 确认。
分步处理
按照以下步骤排查和配置,确保每一步都有明确反馈。
1. 确认本地密钥状态
执行 gpg `--list-secret-keys` `--keyid-format` LONG。如果没有输出,说明本地没有可用私钥,需要先生成。如果有输出,记下 sec 行后面的密钥 ID(通常是 40 位字符或 16 位 hex)。
2. 配置 Git 关联密钥
告诉 Git 使用哪个密钥进行签名。执行:
git config `--global` user.signingkey <KEY_ID>同时检查 Git 的用户邮箱是否与 GPG 密钥中的邮箱一致:
git config `--global` user.email
gpg `--list-keys`如果不一致,签名验证会失败,需修改 Git 邮箱或重新生成带正确邮箱的 GPG 密钥。
3. 上传公钥到远程平台
执行 gpg `--armor` `--export` <KEY_ID>,复制输出的内容(包含 ---`--BEGIN` PGP PUBLIC KEY BLOCK-----)。登录代码托管平台,在设置中找到 SSH and GPG keys 或类似选项,添加新的 GPG key。
4. 重新提交
配置完成后,对新的提交执行 git commit -S -m "message"。如果已开启自动签名,直接 commit 即可。
密钥有效期管理实操
GPG 密钥可以设置有效期。如果密钥过期,签名会失效。
查看有效期:
gpg `--list-keys`延长有效期:
gpg `--edit-key` <KEY_ID>进入交互界面后,输入 expire,设置新的过期时间,最后输入 save 保存。
怎么验证是否生效
本地验证:执行 git log `--show-signature`。如果看到 gpg: Good signature from ...,说明本地签名正常。
远程验证:刷新远程仓库的提交列表页面。正常的签名提交会显示 Verified 标签或绿色对勾图标。如果仍显示 Unverified,检查公钥是否复制完整,或是否有多个密钥冲突。
常见坑
1. 子密钥问题
部分用户习惯使用子密钥签名。配置 Git 时请使用实际用于签名的子密钥 ID,而不是主密钥 ID。
2. 多密钥环境
如果本地有多个密钥,Git 可能默认使用了错误的那个。务必在 git config 中显式指定 user.signingkey。
3. 换行符干扰
复制公钥到网页平台时,确保没有多余的空行或缺失的头部尾部标识,否则平台无法解析。
参考来源
- Git Documentation: git-config - https://git-scm.com/docs/git-config
- GitHub Docs: About commit signature verification - https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
- GnuPG Documentation: How to generate a new key pair - https://www.gnupg.org/documentation/howtos.html
原文链接:https://www.zjcp.cc/ask/11131.html
