SSH 密钥认证完全指南:告别密码,安全登录你的 VPS
每次 SSH 登录 VPS 都要输密码,烦不烦?更要命的是,密码登录本身就是个安全隐患——暴力破解、键盘记录、中间人攻击,哪个都能让你的服务器裸奔。
SSH 密钥认证是解决这一切的标准方案。配置一次,从此免密登录,同时安全性比密码高出几个数量级。
这篇文章从零开始,带你彻底搞懂 SSH 密钥认证的原理和配置方法。
SSH 密钥认证是什么
密码认证的问题
传统的密码登录有几个致命缺陷:
| 问题 | 后果 |
|---|---|
| 密码可以被暴力破解 | 简单密码几分钟就能试出来 |
| 密码在网络中传输 | 存在被截获的风险 |
| 多台服务器用同一密码 | 一台被破全部遭殃 |
| 手动输入效率低 | 无法用于自动化部署 |
密钥认证的原理
SSH 密钥认证基于非对称加密——一对数学上关联的密钥:
- 私钥(Private Key):只存在你的电脑上,绝对不能泄露
- 公钥(Public Key):放在服务器上,公开无所谓
它们的关系就像一把锁和一把钥匙:
连接时的认证过程:
- 你的电脑发起 SSH 连接
- 服务器发来一段随机数据(挑战)
- 你的电脑用私钥对数据签名
- 服务器用公钥验证签名——匹配就放行,不匹配就拒绝
整个过程中,私钥从不离开你的电脑,也不会在网络中传输。即使有人截获了通信数据,没有私钥也无法伪造签名。
为什么叫"非对称"?因为加密和解密用的不是同一把钥匙。用私钥签名的东西,只有对应的公钥能验证;反过来也一样。这和对称加密(比如 AES,加密解密用同一个密码)是本质区别。
为什么比密码安全
| 对比项 | 密码认证 | 密钥认证 |
|---|---|---|
| 暴力破解 | 可能(简单密码尤其脆弱) | 几乎不可能(2²⁵⁶ 种组合) |
| 网络传输 | 密码经过网络传输 | 私钥从不离开本地 |
| 可自动化 | 需要额外工具(sshpass 等) | 天然支持自动化 |
| 多机管理 | 每台都要记密码 | 一个私钥访问多台 |
| 被盗风险 | 钓鱼/社工可获取 | 需要物理接触你的电脑 |
生成 SSH 密钥对
选择算法
目前主流的 SSH 密钥算法:
| 算法 | 密钥长度 | 安全性 | 推荐度 |
|---|---|---|---|
| Ed25519 | 256 bit | 极高 | ⭐⭐⭐ 首选 |
| RSA | 4096 bit | 高 | ⭐⭐ 兼容性好 |
| ECDSA | 256/384/521 bit | 高 | ⭐ 可用 |
| DSA | 1024 bit | 低 | ❌ 已淘汰 |
优先选 Ed25519——它更短、更快、更安全。只有在连接非常老的服务器(OpenSSH < 6.5)时才需要退回 RSA。
在 Windows 上生成
打开 PowerShell(Win + X → Terminal):
交互过程:
passphrase(密码短语)是给私钥加的额外保护。设了的话每次用私钥都要输入这个短语。对于个人开发用途,留空即可;如果是生产环境的重要密钥,建议设置。
生成完成后会有两个文件:
在 Linux/Mac 上生成
命令完全一样:
文件生成在 ~/.ssh/ 目录下。
查看你的公钥
输出类似:
这就是你要放到服务器上的公钥。
在 VPS 上配置免密登录
方法一:ssh-copy-id(推荐)
如果你在 Linux/Mac 上操作,一条命令搞定:
这条命令会自动把公钥追加到服务器的 ~/.ssh/authorized_keys 文件里。执行时需要输一次密码(最后一次!)。
方法二:Windows 手动传输
Windows 没有 ssh-copy-id,用这条命令代替:
同样需要输一次密码。
方法三:完全手动
如果上面两种方法都不好使(比如网络环境特殊),可以手动操作:
设置正确的权限
这一步极其重要!SSH 对文件权限要求非常严格。权限不对,密钥认证会静默失败,退回密码认证——你可能根本不知道配置没生效。
在 VPS 上执行:
权限规则:
| 文件/目录 | 权限 | 含义 |
|---|---|---|
~/.ssh/ | 700 | 只有所有者可读写执行 |
~/.ssh/authorized_keys | 600 | 只有所有者可读写 |
| 私钥文件 | 600 | 只有所有者可读写 |
| 公钥文件 | 644 | 所有者可读写,其他人可读 |
验证是否成功
如果直接登录成功(不要密码),恭喜配置完成!🎉
常见问题排查
配置了密钥但还是要密码
问题诊断清单:
最常见的原因及修复:
| 原因 | 修复 |
|---|---|
~/.ssh 权限不是 700 | chmod 700 ~/.ssh |
authorized_keys 权限不是 600 | chmod 600 ~/.ssh/authorized_keys |
| home 目录权限过大 | chmod 755 ~ |
PubkeyAuthentication 为 no | 改为 yes,然后 systemctl restart sshd |
| 公钥粘贴时有换行或多余空格 | 删掉重新粘贴,确保是完整的一行 |
关闭密码登录(可选,增强安全)
确认密钥登录正常后,可以禁用密码登录彻底防暴力破解:
找到并修改这两行:
然后重启 SSH:
禁用密码前务必确认密钥登录正常! 否则你会把自己锁在服务器外面。建议保持当前 SSH 连接不断,另开一个终端测试密钥登录成功后再关闭密码认证。
管理多台服务器
当你有多台 VPS 时,可以用 SSH config 文件简化连接。
创建 SSH 配置文件
Windows 路径:C:\Users\你的用户名\.ssh\config
Linux/Mac 路径:~/.ssh/config
使用
配置完后,连接变得极其简洁:
同样适用于 scp 和 sftp:
不同场景下的密钥策略
个人开发者
一对密钥走天下就行:
需要隔离的场景
当密钥被泄露时需要最小化影响范围——为不同用途生成独立的密钥对:
然后在 ~/.ssh/config 里指定各自使用的密钥:
总结
SSH 密钥认证的核心就三步:
- 生成密钥对:
ssh-keygen -t ed25519 - 公钥放服务器:追加到
~/.ssh/authorized_keys - 权限设正确:
.ssh目录 700,authorized_keys文件 600
记住这个比喻:公钥是锁,私钥是钥匙。锁可以装在任何门上(多台服务器),但钥匙只能你自己拿着(永远不要分享私钥)。
配好之后不仅免了输密码的烦恼,安全性还提升了几个档次。如果你还想更进一步,可以:
- 禁用密码登录,只允许密钥认证
- 使用
fail2ban防止 SSH 暴力扫描 - 更换 SSH 默认端口(22 → 其他)
- 设置密钥的 passphrase 做二次保护