SSH Key 与 GPG Key 区别详解:Git 使用中的身份与签名机制

一、先给结论(重点)

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 pushgit pull 时遇到:

复制代码
Permission denied (publickey)

说明:

  • 缺 SSH key 或配置不对
  • GPG key 对这个问题完全没帮助

正确组合应为:

复制代码
SSH key → 用来 clone / pull / push
GPG key → 用来 sign commit(可选)

六、SSH key 与 GPG key 的使用流程

SSH key 流程

  1. 生成 SSH key(ssh-keygen
  2. 将公钥添加到 Git 服务器(GitHub/GitLab)
  3. 使用 SSH 协议 clone / push / pull
  4. SSH 自动完成身份验证

GPG key 流程

  1. 生成 GPG key(gpg --full-generate-key

  2. 将公钥上传到 Git 服务器

  3. 配置 Git 使用该 GPG key 签名提交:

    bash 复制代码
    git config --global user.signingkey <GPG_KEY_ID>
    git commit -S -m "Your commit message"
  4. 其他人拉取代码时可验证签名真实性


七、总结一句话

SSH key 解决"我能不能访问仓库"
GPG key 解决"这次提交是不是我本人写的"

换句话说:

  • SSH key = 门禁卡
  • GPG key = 亲笔签名 / 公章

理解了这一点,再也不会混淆,也能根据自己的需求灵活配置。

相关推荐
轻抚酸~2 小时前
使用git维护github项目的简单实践
git·github
小白鸽i4 小时前
【LINUX】将源码驱动文件编译并生效
linux·运维·服务器
C蔡博士4 小时前
Git常用命令
git
做萤石二次开发的哈哈4 小时前
萤石开放平台 音视频 | 产品概述
运维·服务器·萤石云·萤石·萤石开放平台
0思必得04 小时前
[Web自动化] 处理爬虫异常
运维·爬虫·python·selenium·自动化·web自动化
胡斌附体5 小时前
linux(ubuntu)拉取源码进行docker容器部署
linux·git·ubuntu·docker·node·nvm
China_Yanhy5 小时前
我的区块链运维日记 · 第 4 日:死掉的“活”节点 —— 攻克“同步滞后(Lag)”
运维·区块链
阿白逆袭记6 小时前
Git原理与使用详解(六):连接世界——远程仓库与多人协作入门
git
kida_yuan6 小时前
【Linux】说说我对 Wine 与 deepin-wine 的理解
linux·运维·wine