SSH 密钥入门:公钥、私钥与 config 到底是什么
面向新手解释 SSH 公钥、私钥、口令和主机密钥的区别,并用独立密钥与 SSH config 简化 VPS 登录。
上一课我们用 SSH 第一次连接了 VPS。密码登录容易理解,却也容易遇到弱密码、重复使用和暴力猜测等问题。更常见的长期做法是使用 SSH 密钥。
第一次看到“公钥、私钥、主机密钥”时很容易混乱。先记住一句话:用户密钥证明“你是谁”,主机密钥帮助确认“服务器是谁”。 它们不是同一套东西。
一、公钥和私钥怎样配合
可以把用户密钥想成一把不能复制给别人的钥匙和一把安装在门上的锁:
| 文件 | 在哪里 | 能否分享 | 用途 |
|---|---|---|---|
| 私钥 | 你的电脑 | 不能 | 证明登录者持有正确钥匙 |
公钥(通常以 .pub 结尾) | 可以复制到服务器 | 可以 | 告诉服务器允许哪把私钥登录 |
| 私钥口令 | 只由你记住或交给系统钥匙串 | 不能 | 私钥文件被拿走时再增加一道保护 |
服务器保存公钥,不需要得到你的私钥。登录时,双方通过密码学过程完成验证,私钥本身不会发送到服务器。
因此,看到教程要求你“把私钥上传到服务器”时应当停下来复核。私钥也不应该放进公开 Git 仓库、文章截图、聊天记录或网盘共享链接。
二、为学习用 VPS 单独生成一把密钥
在自己的 Mac 或 Linux 电脑上,可以生成一把独立的 Ed25519 密钥:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps_learning -C "vps-learning"命令中各部分的意思是:
-t ed25519:选择现代、常用的密钥算法;-f:指定文件名,避免无意覆盖已有密钥;-C:添加便于自己辨认的注释,不参与认证。
命令会询问是否设置口令。对于日常使用的私钥,建议设置一个独立口令;如果使用系统钥匙串或 ssh-agent,通常不需要每次都重新输入。
生成后会得到两个文件:
~/.ssh/id_ed25519_vps_learning 私钥,不能外传
~/.ssh/id_ed25519_vps_learning.pub 公钥,可以安装到服务器三、把公钥安装到服务器
最稳妥的入口通常是服务商控制面板提供的 SSH Key 功能:创建或重装 VPS 时粘贴 .pub 文件的内容。已经能用密码登录时,也可以使用系统提供的 ssh-copy-id,但 macOS 未必预装这个工具。
无论采用哪种方式,服务器最终都是把一整行公钥写入目标用户的:
~/.ssh/authorized_keysSSH 对文件权限比较严格。常见权限是目录 ~/.ssh 仅本人可访问,authorized_keys 仅本人可写。如果权限过宽,服务端可能为了安全而拒绝使用它。
这里最重要的不是背下命令,而是确认三件事:
1. 公钥安装给了正确的 Linux 用户; 2. 粘贴的是 .pub 内容,而不是私钥; 3. 在关闭密码登录以前,密钥登录已经从另一扇终端窗口验证成功。
四、用 SSH config 把长命令变短
假设教程里的示例服务器地址是 203.0.113.10,用户是 admin,每次完整输入会很繁琐:
ssh -i ~/.ssh/id_ed25519_vps_learning admin@203.0.113.10可以在本机的 ~/.ssh/config 中添加一个别名:
Host learning-vps
HostName 203.0.113.10
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519_vps_learning
IdentitiesOnly yes以后只需:
ssh learning-vpsHost 是你自己取的本地别名;HostName 才是服务器地址。IdentitiesOnly yes 表示只尝试这里指定的密钥,可减少电脑里密钥很多时的混乱。
示例中的 203.0.113.10 是 RFC 5737 保留的文档地址,不能当成真实服务器使用。你要换成控制面板显示的地址,但不要把真实 IP 连同用户名和配置一起公开。
五、不要混淆用户密钥与主机密钥
| 名称 | 谁持有私密部分 | 回答的问题 |
|---|---|---|
| 用户密钥 | 登录者 | “这个人有权限吗?” |
| 主机密钥 | SSH 服务器 | “我连接的是原来那台服务器吗?” |
第一次连接时看到的 SHA256 指纹属于主机密钥。它应该通过服务商控制台等独立渠道核对。以后主机密钥突然变化,可能只是服务器重装,也可能意味着地址被复用或连接被拦截;不要为了消除警告就直接删除旧记录。
六、安全切换顺序
把密码登录改成密钥登录时,建议按这个顺序操作:
1. 保存服务商网页控制台或救援入口; 2. 新建日常管理用户并安装公钥; 3. 保持原会话不退出,从第二个终端验证密钥登录; 4. 确认新用户拥有所需的 sudo 权限; 5. 再逐项评估是否限制 root 与密码登录; 6. 每改一项就开新会话验证,并观察 SSH 日志。
不要同时改端口、防火墙、用户和认证方式。一次改变太多变量,失败时很难知道是哪一层出了问题,也更容易把自己锁在门外。
七、密钥也需要维护
- 每台重要设备或不同用途使用可辨认的独立密钥;
- 设备丢失或成员离开时,从
authorized_keys撤销对应公钥; - 怀疑私钥泄露时,生成新密钥、完成替换,再删除旧公钥;
- 备份私钥时使用可靠加密,并测试恢复流程;
- 不把“密钥不会过期”理解成“永远不用轮换”。
八、总结
SSH 密钥并不是一段更长的密码。它把“可公开安装的公钥”和“只留在本机的私钥”分开,让服务器可以验证你是否持有正确私钥。~/.ssh/config 则负责保存非秘密的连接参数,让日常登录更清楚。
真正安全的切换有两个前提:私钥从未外传,以及新登录方式已经在第二个会话中验证成功。
常见问题
.pub 文件可以发给别人吗?
公钥本来就用于分发,但仍应只安装到你信任、确实需要访问的系统。私钥文件绝不能发给别人。
设置了私钥口令,自动任务怎么办?
优先考虑权限更小的专用密钥、ssh-agent、短期凭据或任务系统的秘密管理功能,不要为了方便把无口令的高权限私钥到处复制。
可以删除密码登录吗?
可以评估,但必须先确认密钥、sudo 和救援控制台都能工作。不同镜像和云平台的默认设置不同,不应直接复制一条命令就关闭入口。
参考来源
Share