GitHub 中的 SSH 连接认证与提交签名

SSH(Secure Shell,安全外壳协议),是一套加密的远程登录协议,标准端口:22。 简单理解:安全地远程连接另一台计算机 / 服务器。

可以使用 SSH(安全外壳协议)在 GitHub 上的存储库中访问和写入数据。 通过 SSH 进行连接时,使用本地计算机上的私钥文件进行身份验证。

SSH 认证:解决「你能不能连上 GitHub、推送代码」(通道权限)

提交签名(SSH 签名 / GPG 签名):解决「这条 commit 到底是不是你写的」(内容真伪)

两者完全独立、互不替代。

当你使用 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

给每一条 commit/tag 数据本身打上数字签名

  • 证明:这条提交由持有私钥的本人创建;
  • 证明:提交内容生成后没有被篡改;
  • GitHub 校验成功,展示绿色 Verified 标识。

Git 原生最早只支持 GPG 签名; Git ≥2.34 新增支持 SSH 签名(可以复用你现有的 SSH 密钥,不用额外生成 GPG)

如果你想用同一把 SSH 密钥既登录 github 又签名 commit: 必须在 GitHub 添加两次:一条 Authentication Key,一条 Signing Key

# 指定使用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

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