GitHub 中的 SSH 连接认证与提交签名
目录
关于 SSH
SSH(Secure Shell,安全外壳协议),是一套加密的远程登录协议,标准端口:22。 简单理解:安全地远程连接另一台计算机 / 服务器。
可以使用 SSH(安全外壳协议)在 GitHub 上的存储库中访问和写入数据。 通过 SSH 进行连接时,使用本地计算机上的私钥文件进行身份验证。
SSH 认证:解决「你能不能连上 GitHub、推送代码」(通道权限)
提交签名(SSH 签名 / GPG 签名):解决「这条 commit 到底是不是你写的」(内容真伪)
两者完全独立、互不替代。
SSH 密钥用于 GitHub 连接认证
作用场景
当你使用 git@github.com:xxx/xxx.git(SSH 协议地址)进行 clone/pull/push,
- 使用 SSH 公私钥完成传输层身份校验
- 替代 HTTPS 方式输入账号密码 / Personal Access Token
- 全程通信流量加密
工作原理
- 本地保存私钥(保密),GitHub 账户保存你的公钥;
- 发起 SSH 连接时,服务器发起加密挑战;
- 本地私钥应答;GitHub 使用公钥验证通过 → 允许访问仓库。
关键特点
- 只在建立网络连接那一刻生效;
- 完全不保护 commit 本身;
- 无法防止提交伪造:任何人本地修改 git config user.name / user.email,就可以伪装成你提交代码并 push 到仓库。
- 举例:别人电脑上设置你的名字邮箱,通过他自己的 SSH 密钥推送,GitHub 只会显示提交人是你,无法识别伪造。
简易配置命令
# 生成ed25519密钥(推荐,优于RSA)
ssh-keygen -t ed25519 -C "你的github注册邮箱"
# 启动agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 复制公钥
cat ~/.ssh/id_ed25519.pub
GitHub 设置 → SSH and GPG keys → New SSH key
Key type 选择:Authentication Key(身份验证密钥)
测试连通:
bash
ssh -T git@github.com
Git 提交签名
核心目标
给每一条 commit/tag 数据本身打上数字签名
- 证明:这条提交由持有私钥的本人创建;
- 证明:提交内容生成后没有被篡改;
- GitHub 校验成功,展示绿色 Verified 标识。
Git 原生最早只支持 GPG 签名; Git ≥2.34 新增支持 SSH 签名(可以复用你现有的 SSH 密钥,不用额外生成 GPG)
如果你想用同一把 SSH 密钥既登录 github 又签名 commit: 必须在 GitHub 添加两次:一条 Authentication Key,一条 Signing Key
实操:使用 SSH 密钥对 commit 进行签名
Git 全局配置
# 指定使用SSH格式签名,而非默认gpg
git config --global gpg.format ssh
# 指定你的SSH公钥路径作为签名密钥
git config --global user.signingkey ~/.ssh/id_ed25519.pub
# 开启:所有commit自动签名(不用每次加参数-S)
git config --global commit.gpgsign true
# 开启tag自动签名
git config --global tag.gpgsign true
GitHub 网页端配置
Settings → SSH and GPG keys → New SSH key Title 随意填写; Key type 务必选择 Signing Key(不要选 Authentication!) 粘贴公钥 id_ed25519.pub 全部内容保存
验证
# 创建空测试提交
git commit --allow-empty -m "test ssh signed commit"
# 查看签名信息
git log --show-signature -1
git push