一、先给结论(重点)
SSH key 和 GPG key 都不是"必须同时配置"
但它们的功能几乎不重叠,是做两件完全不同的事
实际使用建议:
- SSH key:几乎所有开发者都必须配置
- GPG key:只有在"需要提交可信度或签名"的情况下才配置
二、一张表看懂 SSH key 与 GPG key
| 维度 | SSH key | GPG key |
|---|---|---|
| 解决的问题 | 你是谁?你有没有权限? | 这次提交是不是你本人写的? |
| 用在 Git 的位置 | clone / pull / push | commit / tag 签名 |
| 是否参与网络连接 | ✅ 是(建立 SSH 连接) | ❌ 否(只对数据进行签名) |
| 没有它会怎样 | 无法拉取或推送代码 | 能用 Git,但提交不"可信" |
| GitLab/GitHub 必需性 | ✅ 是 | ❌ 否 |
| 常见错误提示 | Permission denied (publickey) |
gpg failed to sign the data |
| 是否能互相替代 | ❌ 完全不能 | ❌ 完全不能 |
三、用一句人话理解区别
SSH key = 门禁卡
-
作用:验证你能不能进入 Git 仓库
-
特点:
- 没有它就无法 clone / pull / push
- 是连接层的身份认证
-
类比:就像公司大楼的门禁卡,你没卡就进不去办公楼
GPG key = 亲笔签名 / 公章
-
作用:验证提交内容是否真的来自你本人
-
特点:
- 提交可以照样被 Git 接收,但不显示"Verified"标志
- 是内容层的真实性校验
-
类比:就像在文件上签名或盖章,别人可以确认是你签的,而不是别人伪造
四、为什么它们看起来有重叠?
很多新手误解在于:
- 两者都叫 key
- 都跟 Git 有关
但核心区别在于信任对象不同:
- SSH key → 服务器信任你
- GPG key → 其他开发者信任你的提交内容
信任的方向不同,所以功能完全不重叠。
五、到底需不需要两个都配置?
大部分开发者情况
| 情况 | 建议配置 |
|---|---|
| 公司 GitLab / GitHub | ✅ SSH key |
| 私有项目 / 日常开发 | SSH key 即可 |
| 开源项目 / 安全要求高 | SSH + GPG |
| 需要显示提交 Verified | 必须 GPG |
总结:
- 90% 开发者只需 SSH key
- GPG key 是可选增强安全措施
遇到实际问题的判断
如果你在执行 git push 或 git pull 时遇到:
Permission denied (publickey)
说明:
- 缺 SSH key 或配置不对
- GPG key 对这个问题完全没帮助
正确组合应为:
SSH key → 用来 clone / pull / push
GPG key → 用来 sign commit(可选)
六、SSH key 与 GPG key 的使用流程
SSH key 流程
- 生成 SSH key(
ssh-keygen) - 将公钥添加到 Git 服务器(GitHub/GitLab)
- 使用 SSH 协议 clone / push / pull
- SSH 自动完成身份验证
GPG key 流程
-
生成 GPG key(
gpg --full-generate-key) -
将公钥上传到 Git 服务器
-
配置 Git 使用该 GPG key 签名提交:
bashgit config --global user.signingkey <GPG_KEY_ID> git commit -S -m "Your commit message" -
其他人拉取代码时可验证签名真实性
七、总结一句话
SSH key 解决"我能不能访问仓库"
GPG key 解决"这次提交是不是我本人写的"
换句话说:
- SSH key = 门禁卡
- GPG key = 亲笔签名 / 公章
理解了这一点,再也不会混淆,也能根据自己的需求灵活配置。