SSH 密钥登录入门:给服务器换一把更安全的钥匙

举报
yd_254412059 发表于 2026/10/26 08:28:19 2026/10/26
【摘要】 本文以 Linux 云服务器为例,讲清 SSH 密钥登录的完整链路:本地生成密钥对、用 ssh-copy-id 或手动方式上传公钥、按 700/600 设置 .ssh 与 authorized_keys 权限,并强调先验证密钥能登录再关闭密码登录,最后给出 Permission denied 的六条排查清单。

密码登录用久了,迟早会遇到弱口令被爆破、口令在多台机器复用、换人后改密码改不干净的问题。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 常见排查清单

按顺序查,大多数问题都在前三条:

  1. 权限:先执行第四节的 chmod 700/600,再看 ls -ld ~/.ssh ~/.ssh/authorized_keys,不要用 777、644 去“图省事”。
  2. 公钥放错地方:确认 authorized_keys 在登录用户的家目录下,root 登录就放 /root/.ssh/,普通用户就放 /home/用户名/.ssh/,不要张冠李戴。
  3. 公钥被截断或多行:authorized_keys 里一个公钥必须是一行,粘贴时断行、多了换行都会失效。
  4. 服务端没开公钥认证:检查 sshd_config 里 PubkeyAuthentication yes,改完要重启 sshd 并用 sshd -t 校验。
  5. 客户端用了错的私钥:用 ssh -v -i 私钥路径 用户@IP 看详细日志,日志里会写明尝试了哪把钥匙、服务端接受了哪种认证方式。
  6. SELinux 或家目录挂载问题:个别加固系统上还需检查审计日志,排除上下文或挂载只读问题。

还有一个高频错误:生成密钥时一路回车覆盖了已有私钥,或者把私钥文件本身上传到了服务器。私钥一旦外泄,就要立刻在所有服务器上删除对应公钥、重新生成一对,而不是只改密码。

七、日常使用建议

  • 私钥设口令,配合 ssh-agent 使用,避免每次都重复输入:ssh-add ~/.ssh/id_ed25519。
  • 一人一钥、一机一钥,离职、换电脑、设备丢失时,只需在服务器上删掉对应的一行公钥。
  • 定期检查 authorized_keys,删掉不认识的旧公钥:cat ~/.ssh/authorized_keys。
  • 能用密钥就不要再开密码登录;必须临时开密码时,事后记得关掉,并确认新窗口仍能用密钥登录。

把上面七步走一遍,你的服务器就从“口令可爆破”变成了“没有私钥登不进”,这是成本最低、收益最明显的一次安全升级。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。