# 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 只会显示提交人是你，无法识别伪造。

### 简易配置命令

```bash
# 生成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 全局配置

```bash
# 指定使用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 全部内容保存

### 验证

```bash
# 创建空测试提交
git commit --allow-empty -m "test ssh signed commit"
# 查看签名信息
git log --show-signature -1
git push
```

