三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Git 提交签名 verification failed 怎么配置 GPG 密钥

Git 提交签名 verification failed 怎么配置 GPG 密钥

遇到 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

← 返回列表