用 SSH 密钥登录 Linux 可免输密码并降低暴力破解风险。流程包括生成 Ed25519 密钥、上传公钥、配置 sshd、设置权限、测试登录、用 ssh-agent 缓存私钥,确认成功后再关闭密码登录。操作时须保留备用入口,防止把自己锁在门外。
用密码登录 Linux 服务器,既麻烦也不安全:每次都要手动输入,还容易遭遇暴力破解。把登录方式换成基于密钥的 SSH 认证后,本地持有私钥,服务器只存公钥,连接时自动完成挑战-响应验证,既省去了重复输密码的步骤,又能从协议层面大幅降低被爆破的风险。
本文从生成密钥、上传公钥、配置 sshd、权限管理、登录测试到最终关闭密码登录,完整走一遍。操作环境以常见的 OpenSSH 为例,适用于大多数 Linux 服务器、macOS 以及 Windows 10/11 自带的 OpenSSH 客户端。
一、密钥登录的核心原理
SSH 密钥对由两把数学上互相关联的“钥匙”组成:
- 私钥(Private Key):保存在本地,相当于你的数字身份,必须保密。
- 公钥(Public Key):放在服务器上,相当于一把“锁”。
登录时,服务器用公钥生成一个随机挑战,只有持有对应私钥的客户端才能正确签名并返回。服务器验证签名通过后,即允许登录。由于私钥从未在网络上传输,安全性远高于密码。
二、生成更安全的 Ed25519 密钥对
传统教程常用 rsa,但当前更推荐 ed25519:密钥更短、生成更快、抗侧信道攻击能力更强。
# 在本地终端执行
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
执行后会提示输入两次私钥密码(passphrase)。如果你希望完全无密码登录,可以直接回车跳过;但为私钥再加一层密码,安全性会更高,配合 ssh-agent 使用时也不会每次手动输入。
生成完成后,本地 ~/.ssh/ 目录下会出现两个文件:
id_ed25519:私钥,绝对不能外传。id_ed25519.pub:公钥,需要上传到服务器。
三、把公钥上传到服务器的三种方式
方式 1:使用 ssh-copy-id(最推荐)
只要本地有 ssh-copy-id 命令,一行就能完成:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.1.100
系统会要求输入一次服务器当前用户的密码,验证通过后,公钥会自动追加到服务器 ~/.ssh/authorized_keys 文件中。
方式 2:手动复制公钥
某些精简系统没有 ssh-copy-id,可以手动操作:
# 本地:复制公钥内容到剪贴板
cat ~/.ssh/id_ed25519.pub
然后登录服务器,把刚才复制的内容追加到 authorized_keys:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
方式 3:通过云平台或面板导入
如果你使用的是云服务器,很多控制台都提供“绑定密钥”功能,直接在创建实例时注入公钥即可,无需手动修改 authorized_keys。
四、服务器端 SSH 服务配置
登录服务器,编辑 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
确保以下关键配置存在且未被注释:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin prohibit-password
其中 PermitRootLogin prohibit-password 表示 root 用户只能用密钥登录,不能再用密码。如果你还没测试成功,暂时不要设置 PasswordAuthentication no,否则一旦密钥登录失败,会直接把自己锁在门外。
修改完成后,重启 SSH 服务:
# Debian/Ubuntu
sudo systemctl restart sshd
# CentOS/RHEL
sudo systemctl restart sshd
# 旧版本可能用
sudo service sshd restart
五、权限管理:最容易踩的坑
OpenSSH 对权限非常敏感,设置不对就会认证失败。服务器端必须满足:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
本地私钥也要设置成仅自己可读:
chmod 600 ~/.ssh/id_ed25519
如果用户家目录或 .ssh 目录被其他用户可写,SSH 会直接拒绝使用 authorized_keys。
六、测试密钥登录
在保留一个已登录会话的前提下,另开一个终端测试:
ssh root@192.168.1.100
如果私钥没有设置 passphrase,应该直接登录成功;如果设置了 passphrase,会提示输入私钥密码。输入正确后进入服务器,说明密钥认证已经生效。
七、使用 ssh-agent 管理私钥密码
如果你的私钥加了密码,每次登录都要输入一遍,体验并不好。可以启用 ssh-agent,把私钥解密一次后缓存起来:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
之后在当前终端会话中,所有 SSH 连接都会自动使用已缓存的私钥,无需重复输入密码。
八、确认无误后关闭密码登录
密钥登录稳定运行一段时间,并且你确定备用入口(如云控制台、VNC)可用后,再禁用密码登录:
sudo vim /etc/ssh/sshd_config
添加或修改:
PasswordAuthentication no
重启 sshd 生效:
sudo systemctl restart sshd
注意:关闭密码登录前,务必保留一个已连接的 SSH 窗口用于回退;如果配置出错,云控制台/VNC 是你最后的救命稻草。
九、排查登录失败
如果测试登录失败,可以在服务器端查看认证日志:
# Debian/Ubuntu
sudo tail -f /var/log/auth.log
# CentOS/RHEL
sudo tail -f /var/log/secure
本地也可以用 verbose 模式看详细握手过程:
ssh -vvv root@192.168.1.100
常见问题包括:文件权限太宽、authorized_keys 路径错误、SELinux 上下文异常、sshd_config 语法错误等。
十、安全 checklist
- 私钥文件只保存在本地,禁止上传网盘或发送给他人。
- 为私钥设置 passphrase,配合 ssh-agent 使用。
- 服务器端
~/.ssh权限 700,authorized_keys权限 600。 - 关闭密码登录前,先确认密钥登录可用,并保留备用入口。
- 定期检查
authorized_keys,清理不再使用的公钥。
总结
把 SSH 登录方式从密码切换到密钥,并不只是“少输一次密码”的体验优化,而是服务器安全加固的基础步骤。核心流程可以概括为:本地生成密钥对 → 公钥上传到服务器 authorized_keys → 配置 sshd 启用公钥认证 → 测试成功后再禁用密码。按这个顺序操作,既能避免把自己锁在门外,也能让服务器的远程入口更加安全。
- 文章名称:SSH 密钥登录完整指南:服务器从生成密钥到关闭密码登录
- 文章永久网址:https://www.997wan.com/ssh-key-login-setup-ed25519/
- 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长 997笔记 进行删除处理。
- 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
- 如无特别声明本文即为原创文章仅代表个人观点,版权归《997笔记》所有,欢迎转载,转载请保留原文链接。