服务器 ssh 密钥登录如何配置

juming
juming 正式会员超兽战士
发布于 2026-10-07 16:09 ·1 浏览 ·0 回复

学完这篇,你能从零把服务器 SSH 登录从「密码方式」改成「密钥方式」,并保证改完之后自己不会被锁在门外。

第一步:在本地生成一对密钥

这一步要做什么:在你的电脑上生成一把私钥和一把公钥。私钥留在本地,公钥传到服务器。做完后你会得到两个文件。

打开本地终端(Windows 用 PowerShell 或 CMD,macOS/Linux 用 Terminal),执行:

ssh-keygen -t ed25519 -C "你的备注"

-t ed25519 指定密钥算法,比老的 RSA 更短更安全。如果服务器系统很旧(比如 CentOS 6),改用 -t rsa -b 4096。

执行后会问三件事:

  1. Enter file in which to save the key —— 直接回车,默认存到 ~/.ssh/id_ed25519
  2. Enter passphrase —— 给私钥设一个密码,建议设
  3. Enter same passphrase again —— 再输一遍

完成后生成两个文件:

  • ~/.ssh/id_ed25519 —— 私钥,绝对不能外传
  • ~/.ssh/id_ed25519.pub —— 公钥,可以随便贴

注意:Windows 上 ~ 指的是 C:\Users\你的用户名,不是 C:\ 根目录。找不到文件时先确认路径。

第二步:把公钥传到服务器

这一步要做什么:把本地公钥的内容,追加到服务器上目标用户的 authorized_keys 文件里。做完后服务器就认识你这台电脑了。

先确认服务器上已经开了密码登录(后面还要靠它传文件)。在本地执行:

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@你的服务器IP

它会提示输入服务器密码,输完就把公钥写进去了。

如果本地没有 ssh-copy-id(Windows 默认没有),用下面这条手动传:

cat ~/.ssh/id_ed25519.pub | ssh root@你的服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

注意:authorized_keys 的权限必须是 600,.ssh 目录必须是 700。权限过宽 SSH 会直接拒绝密钥登录,而且不报明显错误,只让你反复输密码。这是最常见的一个坑。

验证一下,用密钥登录:

ssh -i ~/.ssh/id_ed25519 root@你的服务器IP

如果不再问密码就进去了,说明密钥已经生效。确认能进去之后,再往下走。

第三步:关闭密码登录

这一步要做什么:修改 SSH 服务端配置,只允许密钥登录。做完后暴力破解密码的流量就完全无效了。

先在服务器上编辑配置文件:

vim /etc/ssh/sshd_config

找不到这个文件时,检查 /etc/ssh/sshd_config.d/ 目录,有些发行版(Ubuntu 22.04 及以上)把配置拆到了这里。

找到并改成下面这几项(前面有 # 的把 # 去掉):

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
  • PubkeyAuthentication yes —— 启用密钥认证
  • PasswordAuthentication no —— 关闭密码认证
  • PermitRootLogin prohibit-password —— 允许 root 用密钥登录,但禁止 root 用密码登录

改完保存,先在重启前检查语法,避免配置写错导致 SSH 起不来:

sshd -t

没有任何输出就是语法正确。然后重启服务:

systemctl restart sshd

Ubuntu/Debian 上服务名可能是 ssh,用 systemctl restart ssh。

注意:重启前务必另开一个终端窗口保持当前连接不要关。用新窗口测试能登录成功,再关掉旧窗口。否则配置写错就会把自己彻底锁在外面,只能走服务商的控制台救援。

第四步:测试并加固

这一步要做什么:确认新配置生效,顺手做几项基础防护。

新开一个终端,用密钥登录:

ssh root@你的服务器IP

进去了就说明成功。再故意用密码试一次,应该直接被拒绝:

ssh -o PreferredAuthentications=password root@你的服务器IP

提示 Permission denied (publickey) 就是对的。

可选加固,在 sshd_config 里追加:

Port 2222

把默认的 22 端口改掉,能挡掉大量自动化扫描。改完同样 sshd -t 检查再重启,并记得放行新端口:


firewall-cmd --permanent --add-port=2222/tcp && firewall-cmd --reload
# ufw
ufw allow 2222/tcp

注意:改端口之前先确认防火墙放行了新端口,再重启 sshd。顺序反了会造成「端口没开、SSH 已换」的尴尬局面。

小结

  • 本地 ssh-keygen -t ed25519 生成密钥对,私钥不外传,公钥传到服务器
  • 公钥写入 ~/.ssh/authorized_keys,权限 600,.ssh 目录 700
  • 服务器改 /etc/ssh/sshd_config:PubkeyAuthentication yes、PasswordAuthentication no、PermitRootLogin prohibit-password
  • 改完先 sshd -t 检查语法,再 systemctl restart sshd,全程保留一个旧连接做退路
  • 想更安全就改默认端口,但记得先放行防火墙再重启服务
版权声明:本文来自 GJ站长论坛《服务器 ssh 密钥登录如何配置》
原文链接:https://www.gj0.com/thread-391.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~