SSH 密钥登录入门:给服务器换一把更安全的钥匙
密码登录用久了,迟早会遇到弱口令被爆破、口令在多台机器复用、换人后改密码改不干净的问题。SSH 密钥登录把“你知道什么”换成“你持有什么”:私钥只留在自己电脑上,服务器上只放公钥,登录时双方做一次密码学验证,不用在网络上传输口令。本文用一台 Linux 云服务器(以华为云 ECS 为例)走通完整流程。
一、先想清楚:私钥和公钥各放哪
- 私钥(id_ed25519):只放在你自己的电脑上,相当于钥匙,绝不发给别人、不上传到服务器、不贴到聊天记录和工单里。
- 公钥(id_ed25519.pub):可以公开,放在服务器的 ~/.ssh/authorized_keys 里,相当于锁。
- 一对密钥对应一台或一个人的常用设备,换电脑就重新生成一对,不要把同一个私钥到处拷贝。
二、第一步:在本地生成密钥对
在本地终端执行:
ssh-keygen -t ed25519 -C "your-email@example.com"
一路回车会生成默认文件;建议给私钥设一个口令(passphrase),这样即使电脑被拿走,私钥也不能直接用。生成后查看:
ls -l ~/.ssh/
cat ~/.ssh/id_ed25519.pub
看到以 ssh-ed25519 开头、以注释结尾的一长串,就是公钥。如果本机已有密钥且确定是自己生成的,可以复用,不要无故覆盖旧密钥,否则旧服务器会登不上去。
三、第二步:把公钥上传到服务器
最省事的方法是 ssh-copy-id,它会自动创建目录并追加公钥:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP
如果没有 ssh-copy-id,也可以手动做,效果完全一样。先用原有密码登录一次服务器,然后执行:
mkdir -p ~/.ssh
cat >> ~/.ssh/authorized_keys <<'EOF'
ssh-ed25519 AAAAC3...(这里粘贴你本地 id_ed25519.pub 的完整内容)
EOF
注意:粘贴时不要换行截断,也不要在公钥前后多加空格或引号,一行就是一个公钥。
四、第三步:权限不对,密钥也登不上去
这是新手最常踩的坑。SSH 服务端对权限很敏感,太宽松会被直接忽略:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~
对照表:
| 路径 | 正确权限 | 含义 |
|---|---|---|
| ~/.ssh | 700 | 只有自己能进目录 |
| ~/.ssh/authorized_keys | 600 | 只有自己能读写 |
| 家目录 | 700 或 755 视发行版而定,至少不能组写 | 防止他人篡改 .ssh |
改完权限后,先不要急着关密码登录。
五、第四步:先验证密钥能登录,再关密码登录
顺序绝对不能反。先新开一个终端窗口测试:
ssh -i ~/.ssh/id_ed25519 root@服务器IP
能免密(或只输私钥口令)登录,说明密钥链路通了。此时再回到服务器,谨慎地关闭密码登录。编辑 /etc/ssh/sshd_config,把下面两项改成 no:
PasswordAuthentication no
ChallengeResponseAuthentication no
然后检查配置并重启服务,不同发行版命令不同,任选其一:
sshd -t
systemctl restart sshd
# 有的系统服务名是 ssh:systemctl restart ssh
重启后,再新开一个窗口确认密钥仍能登录;旧窗口先别关,万一改错了还能立刻改回来。华为云 ECS 用户还要注意:不要只在控制台改安全组就以为万事大吉,安全组放行 22 端口是前提,但密钥登录本身由 sshd_config 控制。
六、Permission denied 常见排查清单
按顺序查,大多数问题都在前三条:
- 权限:先执行第四节的 chmod 700/600,再看
ls -ld ~/.ssh ~/.ssh/authorized_keys,不要用 777、644 去“图省事”。 - 公钥放错地方:确认 authorized_keys 在登录用户的家目录下,root 登录就放 /root/.ssh/,普通用户就放 /home/用户名/.ssh/,不要张冠李戴。
- 公钥被截断或多行:authorized_keys 里一个公钥必须是一行,粘贴时断行、多了换行都会失效。
- 服务端没开公钥认证:检查 sshd_config 里
PubkeyAuthentication yes,改完要重启 sshd 并用sshd -t校验。 - 客户端用了错的私钥:用
ssh -v -i 私钥路径 用户@IP看详细日志,日志里会写明尝试了哪把钥匙、服务端接受了哪种认证方式。 - SELinux 或家目录挂载问题:个别加固系统上还需检查审计日志,排除上下文或挂载只读问题。
还有一个高频错误:生成密钥时一路回车覆盖了已有私钥,或者把私钥文件本身上传到了服务器。私钥一旦外泄,就要立刻在所有服务器上删除对应公钥、重新生成一对,而不是只改密码。
七、日常使用建议
- 私钥设口令,配合 ssh-agent 使用,避免每次都重复输入:
ssh-add ~/.ssh/id_ed25519。 - 一人一钥、一机一钥,离职、换电脑、设备丢失时,只需在服务器上删掉对应的一行公钥。
- 定期检查 authorized_keys,删掉不认识的旧公钥:
cat ~/.ssh/authorized_keys。 - 能用密钥就不要再开密码登录;必须临时开密码时,事后记得关掉,并确认新窗口仍能用密钥登录。
把上面七步走一遍,你的服务器就从“口令可爆破”变成了“没有私钥登不进”,这是成本最低、收益最明显的一次安全升级。
- 点赞
- 收藏
- 关注作者
评论(0)