让 Git 提交自动带「Verified」徽章:GitHub SSH 签名免 ssh-agent 实战
你有没有遇到过这种情况兴冲冲给 Git 配好 SSH 签名结果一提交就报错Couldnt get agent socket?然后被「每次开终端先eval $(ssh-agent -s)再ssh-add」的繁琐流程劝退本文讲一个更简单的方案把user.signingkey直接指向私钥文件从此git commit全自动签名彻底不需要 ssh-agent、不需要 Windows 服务、不需要任何前置命令。为什么要给提交签名没签名的提交GitHub 上长这样liuweiqing committed 2 minutes ago签名之后liuweiqing committed 2 minutes ago ✓ Verified那个绿色Verified徽章的意义是这个提交确实出自你本人没有被中间人篡改或冒名顶替。在开源协作、团队 CI 校验、供应链安全越来越受重视的今天签名提交正在从「加分项」变成「默认项」。GitHub 支持三种签名方式GPG / SSH / S/MIME。本文聚焦最省事的SSH 签名——前提是你已经有一把 SSH 密钥大概率你已经在用它git push了。背景SSH 签名的两个阶段Git 的 SSH 签名机制分两步签名git调用ssh-keygen -Y sign用你的私钥对提交内容生成签名。验证git log --show-signature调用ssh-keygen -Y verify用allowed_signers文件把邮箱映射到公钥来校验。问题就出在第 1 步。Git 默认把user.signingkey当作公钥交给ssh-keygen去签名——但ssh-keygen只能从 ssh-agent 拿私钥没法直接读私钥文件。于是没有 agent → 报错Couldnt get agent socket?有了 agent 但没ssh-add→ 还是报错这就是「每次开终端都要折腾 agent」这个坏习惯的来源。关键技巧让 signingkey 直接指向私钥文件绕开 agent 的核心就一句话把user.signingkey设成私钥文件路径如~/.ssh/id_rsa而不是公钥内容。当signingkey是一个文件路径时ssh-keygen会直接读取该文件里的私钥完成签名完全不需要 agent 中转。这一改整个繁琐链路就消失了。完整配置步骤从 0 到 Verified以下示例邮箱为liuweiqing147gmail.com请替换成你自己的。1. 确认已有 SSH 密钥ls~/.ssh/*.pub# 输出示例/c/Users/13963/.ssh/id_rsa.pub如果没有先生成一把推荐复用你登录 GitHub 的那把省事# 仅当你还没有密钥时才需要ssh-keygen-trsa-b4096-Cyouexample.com2. 写入 Git 全局签名配置# 告诉 git 用 SSH 格式签名gitconfig--globalgpg.formatssh# ★ 关键signingkey 指向「私钥文件」不是公钥内容gitconfig--globaluser.signingkey ~/.ssh/id_rsa# 提交和 tag 自动签名之后不需要再手动加 -Sgitconfig--globalcommit.gpgsigntruegitconfig--globaltag.gpgsigntrue3. 创建 allowed_signers 文件这是 SSH 签名必须的映射文件把邮箱和公钥对应起来验证阶段要用gitconfig--globalgpg.ssh.allowedSignersFile ~/.ssh/allowed_signers# 把你自己的邮箱 公钥写进去printf%s namespacesgit %s\n\liuweiqing147gmail.com\$(cat~/.ssh/id_rsa.pub)~/.ssh/allowed_signers文件内容形如liuweiqing147gmail.com namespacesgit ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC...4. 完成 —— 不需要启动任何 agent到此为止配置全部完成。没有 ssh-agent、没有 Windows 服务、没有前置命令。验证签名链路随便建个临时仓库测一下不开 agent纯全局配置cd/tmprm-rfgit-checkmkdirgit-checkcdgit-checkgitinit-qgitcommit-q--allow-empty-S-mtest signed commit# 或直接 git commit已全局开启gitlog --show-signature-1看到这行就成功了Good git signature for liuweiqing147gmail.com with RSA key SHA256:V6n/4TEs...8A如果显示Good说明签名 本地验证全链路打通。还差你最后一步把公钥加到 GitHubGit 这边配好了但 GitHub不知道这把公钥是你的所以提交推上去仍是Unverified。需要在 GitHub 网页单独登记一次「签名密钥」复制公钥内容cat~/.ssh/id_rsa.pub打开 https://github.com/settings/ssh/newTitle随便填如laptop-signingKey type 务必选Signing Key默认是 Authentication Key选错不会生效粘贴公钥 →Add SSH key⚠️ 即使这把id_rsa已经作为「Authentication key」加过GitHub 也要求再单独加一次到 Signing keys 区。两者是分开管理的。加完之后再git push上来的提交就会显示绿色Verified徽章 常见坑 FAQ现象原因解决Couldnt get agent socket?signingkey是公钥git 去找 agent 拿私钥把signingkey改成私钥文件路径本地Good但 GitHub 显示Unverified公钥没加到 GitHub 的Signing keys去 settings/ssh/newKey type 选 Signing Key 重加No principal matched/ 验证失败allowed_signers里邮箱和提交邮箱不一致确保allowed_signers邮箱 git config user.email私钥有密码时仍提示输入正常签名时要解锁私钥要么输密码要么换无密码密钥注意保管关于私钥密码本文示例用的是无密码密钥所以签名完全无感。如果你的私钥设了密码每次签名仍需输一次——这是安全与便利的取舍按需选择。总结让 Git 提交自动带Verified徽章最省事的配置就这几行gitconfig--globalgpg.formatsshgitconfig--globaluser.signingkey ~/.ssh/id_rsa# 私钥文件免 agent 的关键gitconfig--globalcommit.gpgsigntruegitconfig--globaltag.gpgsigntruegitconfig--globalgpg.ssh.allowedSignersFile ~/.ssh/allowed_signers再加上 GitHub 网页登记一次 Signing Key就齐活了。告别 ssh-agent从此git commit即签名。本文基于 Windows Git for Windows 2.53 OpenSSH 实测验证。其他平台macOS / Linux步骤完全一致区别仅在于密钥路径。