日常开发中,"证书""密钥""签名"这几个词经常被混用,尤其是 SSH 和 SSL/TLS------很多人以为二者用的是同一套证书体系,其实完全不是。本文按"协议关系 → 密码学基础 → SSH 实践 → 工具溯源"的顺序,把这套知识体系一次讲透。
1. 顶层定性:SSL、SSH、HTTPS 到底是什么关系
先给一句结论:
SSL/TLS 是传输层加密协议(SSL 已被 TLS 取代,但习惯上仍统称 SSL);HTTPS 是 HTTP 叠加 TLS 后的应用层协议;SSH 是另一个独立的远程登录协议,与 TLS 并列而非从属。 三者都建立在公钥加密之上,但协议栈、证书格式、信任模型完全独立,彼此不能互换或混用。
对应到日常场景:浏览网页走 HTTPS(TLS),远程登服务器、git clone 走 SSH。两者都依赖"公钥 + 信任机制",但走的是两条互不相通的技术路线,这是理解后文所有内容的前提。
2. 公私钥对与证书:从原材料到身份包装
2.1 公私钥对是密码学的"原材料"
非对称加密的核心是一对数学关联的密钥:
- 私钥:仅自己持有,绝不外传,类比"钥匙"
- 公钥:可任意公开分发,类比"锁"
它支持两类操作:私钥加密(即签名)可被公钥验证,用于证明"是我发出的";公钥加密后只有对应私钥能解开,用于保证"只有我能看"。
2.2 证书解决的是"公钥归属"问题
单独一把公钥毫无意义------你无法判断这把公钥究竟属于 example.com,还是攻击者伪造的。证书的作用正是把公钥与身份(域名、用户名、组织等)绑定,再由可信第三方(CA)签名担保。
三者的关系可以浓缩为一句话:公私钥对是先于一切存在的原材料,证书是"公钥 + 身份 + CA 签名"打包后的成品,私钥永远不出现在证书里。
3. 数字签名:证书信任链的核心机制
3.1 直觉类比
想象你在欠条上按手印:欠条内容是原始消息,手印是签名(他人无法伪造),比对指纹库的过程就是验签。数字签名把这套逻辑搬进了数学世界。
3.2 技术实现
签名与验签的完整流程如下:
关键点在于:私钥用于签名,公钥用于验签,方向与"公钥加密、私钥解密"正好相反,容易混淆;签名对象是消息的哈希摘要而非全文,兼顾了效率与安全。
将三个概念串联到 HTTPS 握手过程:网站预先生成公私钥对,由 CA 用自己的私钥为"公钥 + 域名"签发证书;浏览器内置受信 CA 的公钥,握手时用它验证证书签名,确认证书未被篡改且域名匹配,从而信任证书中的公钥确实属于该网站。
4. SSH 的"证书"误区与两种认证模式
4.1 常见误区:日常使用的并非证书
很多初级开发者认为 ssh-keygen 生成的就是"证书",这是最常见的认知偏差:
日常执行
ssh user@server时使用的是纯密钥对 (默认路径类似~/.ssh/id_ed25519及其.pub文件),而非证书。SSH 证书是更进阶的用法,需要自建一套 SSH CA 来签发,普通开发日常很少接触。
4.2 两种认证模式对比
日常模式下,服务器管理员相当于自己维护了一份"信任白名单",缺点是密钥默认永不过期、机器规模变大后难以统一吊销。证书模式则由集中的 SSH CA 签发短生命周期证书,吊销只需更新 CA 的吊销列表(KRL),无需逐台修改白名单。
4.3 SSH 证书与 SSL 证书的本质差异
| 维度 | SSL/TLS 证书 | SSH 证书(进阶模式) |
|---|---|---|
| 格式 | X.509(PEM/DER 编码) | OpenSSH 自定义格式 |
| 签发机构 | 商业 CA 或企业内建 CA | 自建 SSH CA |
| 签发对象 | 域名 | 用户公钥 / 主机公钥 |
| 生态互通性 | 浏览器及全行业通用 | 仅限 OpenSSH 生态 |
| 证书链 | 支持多级中间 CA | 不支持证书链 |
一句话总结:除 SSH 证书外,绝大多数叫得出名字的证书(代码签名证书、S/MIME 邮件证书、客户端证书等)都属于 X.509 家族,与 SSH 证书是两套互不兼容的体系。
5. Windows 下 SSH 工具溯源与实践建议
签发密钥或证书所依赖的核心命令是 ssh-keygen,它隶属于 OpenSSH 套件,并非 Git 官方发明。在 Windows 环境下,它通常来自以下三个渠道之一:
说明:以上路径为示意结构,实际安装路径以本机 Git 安装位置为准,此处按脱敏惯例以
foo/bar代替具体目录层级。
很多开发者习惯在 Git Bash 中直接使用 ssh-keygen,误以为这是 Git 自带功能,实际情况是 Git for Windows 安装包顺带打包了一份 OpenSSH 工具链,源头仍是 OpenSSH 项目本身。若在 PowerShell 或 cmd 中提示"不是内部或外部命令",可选择安装系统自带的 OpenSSH 客户端可选功能,或将 Git 安装目录下的 usr/bin 加入系统 PATH 环境变量,也可以直接切换到 Git Bash 或 WSL 环境执行。
总结
把全文归纳为一句记忆口诀:
公私钥是地基,证书是带身份的公钥包装,签名是 CA 盖下的信任印章;HTTPS 依赖 TLS 与 X.509 证书体系,SSH 日常依赖裸密钥对,只有在需要集中管理与短期授权时才引入 SSH 证书体系。
后续实践方向:可先用 ssh-keygen -t ed25519 生成一对属于自己的 SSH 密钥体验日常模式;如需进一步理解 X.509 证书的完整生命周期,可关注"自建 CA 签发 TLS 证书并导入浏览器信任"相关的实操内容。
说明:本文内容基于 SSH/TLS 公开协议规范及 OpenSSH 官方文档整理,如需核实具体版本号或特性支持情况,建议以 OpenSSH release notes 及相关 RFC 为准。