密码登录存在被暴力破解的风险,而 SSH 密钥登录通过非对称加密彻底规避了这一问题:私钥留在本地、公钥放到服务器,登录时无需输密码,安全性远高于任何密码。本文完整演示从生成密钥对、上传公钥,到测试成功后禁用密码登录的全部步骤。

本文要点

  • 用 ssh-keygen 生成 RSA 或 ED25519 密钥对
  • 用 ssh-copy-id 或手动方式上传公钥
  • 配置 authorized_keys 并验证密钥登录
  • 确认成功后禁用密码登录

密钥登录原理

要素保管位置作用
私钥(id_rsa 或 id_ed25519)本地电脑 ~/.ssh/登录时证明身份,绝不上传
公钥(id_rsa.pub 或 id_ed25519.pub)服务器 ~/.ssh/authorized_keys服务器用它验证你的身份

第一步:生成密钥对

本地电脑的终端执行(Mac/Linux 直接运行;Windows 用 PuTTYgen 或 WSL):

ssh-keygen -t ed25519 -C "my-vps-key"

-t ed25519 指定更现代、更安全的算法;-C 是注释,便于区分多对密钥。

执行后会提示:

Enter file in which to save the key (~/.ssh/id_ed25519):  # 直接回车用默认路径
Enter passphrase (empty for no passphrase):              # 可设密码短语,增加一层保护
Enter same passphrase again:

密码短语是可选的

密码短语(passphrase)不是服务器的密码,而是保护私钥文件本身。设置了就算私钥文件被盗,没有短语也打不开。如果追求便利可留空。

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

方法一:ssh-copy-id(推荐)

Mac/Linux 上最简便的方式:

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 28766 root@198.51.100.23

命令会自动把公钥追加到服务器的 ~/.ssh/authorized_keys 文件中,并设置正确权限。

方法二:手动复制

如果没有 ssh-copy-id(如 Windows Git Bash),可手动操作:先查看本地公钥内容:

cat ~/.ssh/id_ed25519.pub

复制输出内容,然后 SSH 登录服务器执行:

mkdir -p ~/.ssh
echo '粘贴你的公钥内容' >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

权限必须正确

authorized_keys 权限必须是 600,~/.ssh 目录权限必须是 700,否则 SSH 会忽略公钥,导致仍需密码登录。

第三步:测试密钥登录

在保持当前 SSH 连接的情况下,新开一个终端窗口测试:

ssh root@198.51.100.23 -p 28766 -i ~/.ssh/id_ed25519

如果不需要输入密码直接登录,说明密钥配置成功。

先测试再禁用密码

务必确认密钥登录完全正常后,再执行禁用密码登录的操作。如果先禁用再发现密钥有问题,会把自己锁在外面。

第四步:禁用密码登录(可选但推荐)

密钥登录成功后,可关闭密码认证,彻底阻断暴力破解:

nano /etc/ssh/sshd_config

找到并修改以下配置项(若没有则新增):

PasswordAuthentication no
PermitRootLogin prohibit-password

保存后重启 SSH 服务:

systemctl restart ssh    # Debian/Ubuntu
# 或
systemctl restart sshd   # CentOS/AlmaLinux

小结

  • 生成密钥:ssh-keygen -t ed25519
  • 上传公钥:ssh-copy-id 最方便,手动也可以
  • 权限正确:~/.ssh 是 700,authorized_keys 是 600
  • 先测试密钥登录,成功后再禁用密码

常见问题

生成密钥时选 RSA 还是 ED25519?

推荐 ED25519,算法更现代、密钥更短、安全性更高。老系统不支持时才用 RSA -b 4096。

多台电脑需要各自生成密钥吗?

可以每台各生成一对密钥,把多个公钥都追加到 authorized_keys 里,每行一条。

禁用密码登录后忘带密钥设备怎么办?

可用 KiwiVM 紧急控制台登录服务器,临时将 PasswordAuthentication 改回 yes,连接后再改回来。

公钥上传失败、permission denied 怎么处理?

检查 ~/.ssh 目录权限是否为 700、authorized_keys 是否为 600;同时确认 sshd_config 中 AuthorizedKeysFile 配置正确。