密码登录存在被暴力破解的风险,而 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:密码短语是可选的
第二步:上传公钥到服务器
方法一: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权限必须正确
第三步:测试密钥登录
在保持当前 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 配置正确。