服务器 ssh 密钥登录如何配置
学完这篇,你能从零把服务器 SSH 登录从「密码方式」改成「密钥方式」,并保证改完之后自己不会被锁在门外。
第一步:在本地生成一对密钥
这一步要做什么:在你的电脑上生成一把私钥和一把公钥。私钥留在本地,公钥传到服务器。做完后你会得到两个文件。
打开本地终端(Windows 用 PowerShell 或 CMD,macOS/Linux 用 Terminal),执行:
ssh-keygen -t ed25519 -C "你的备注"
-t ed25519 指定密钥算法,比老的 RSA 更短更安全。如果服务器系统很旧(比如 CentOS 6),改用 -t rsa -b 4096。
执行后会问三件事:
Enter file in which to save the key—— 直接回车,默认存到~/.ssh/id_ed25519Enter passphrase—— 给私钥设一个密码,建议设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,全程保留一个旧连接做退路 - 想更安全就改默认端口,但记得先放行防火墙再重启服务
原文链接:https://www.gj0.com/thread-391.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。