SSH 密钥登录完整指南:服务器从生成密钥到关闭密码登录

AI 摘要997笔记AI

用 SSH 密钥登录 Linux 可免输密码并降低暴力破解风险。流程包括生成 Ed25519 密钥、上传公钥、配置 sshd、设置权限、测试登录、用 ssh-agent 缓存私钥,确认成功后再关闭密码登录。操作时须保留备用入口,防止把自己锁在门外。

此内容由AI根据文章内容自动生成。

用密码登录 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 启用公钥认证 → 测试成功后再禁用密码。按这个顺序操作,既能避免把自己锁在门外,也能让服务器的远程入口更加安全。

上一篇 iStoreOS 安装教程:从下载地址到 PVE、ESXi、X86 部署与改 IP