核心原理:非对称密钥,私钥放本地、公钥上传服务器,免密、比密码登录更安全。
推荐:使用 ed25519 密钥(优先,安全、短),兼容差的老服务器再用 rsa。
一、客户端生成密钥对
1. Linux / Mac / WSL(终端)
# 生成 ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "your-email@example.com"
-C:备注,方便区分密钥回车后:
保存路径:默认
~/.ssh/id_ed25519,直接回车即可密钥口令(passphrase):可选填!
填了:每次使用私钥都要输这个口令(更安全,推荐)
不填:直接免密登录
如果服务器很老不支持 ed25519,换 RSA:
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
生成后两个文件:
id_ed25519:私钥!绝对不能泄露id_ed25519.pub:公钥,上传到服务器
2. Windows 客户端两种方式
方式 A:PowerShell(自带 OpenSSH,Win10 1809+)
打开 PowerShell,命令同上:
ssh-keygen -t ed25519 -C "your-email@example.com"
默认路径:C:\Users\你的用户名\.ssh\id_ed25519
方式 B:Xshell / FinalShell
工具内【用户密钥管理】→ 新建密钥,选择 ed25519,导出公钥。
二、把公钥上传到远程服务器(3 种方法)
前提:现在你还能密码 SSH 连上服务器
方法 1:ssh-copy-id(最简单,Linux/Mac/WSL)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP
替换
root和服务器 IP,输入一次服务器密码自动把公钥追加到
~/.ssh/authorized_keys,自动处理权限
方法 2:手动追加公钥(通用,所有平台都能用)
先登录服务器
ssh root@服务器IP
服务器上创建 ssh 目录(不存在才需要)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
把本地
id_ed25519.pub全部内容复制追加到授权文件
echo "粘贴你的公钥整串内容" >> ~/.ssh/authorized_keys
设置关键权限(权限不对会直接登录失败!SSH 很严格)
chmod 600 ~/.ssh/authorized_keys
✅ 权限标准:
.ssh目录:700authorized_keys:600
属主必须是登录用户,不能是 root 或者其他用户
方法 3:FinalShell/Xshell 图形化上传
连接服务器 → 右键会话 → 密钥上传,粘贴公钥。

三、服务端 SSH 配置(/etc/ssh/sshd_config)
登录服务器编辑 sshd 配置:
vi /etc/ssh/sshd_config
确保下面几项配置(按需开启)
# 开启公钥认证
PubkeyAuthentication yes
# 公钥存放文件
AuthorizedKeysFile .ssh/authorized_keys
# 可选:关闭密码登录(密钥调试成功后再关!防止锁服务器)
# PasswordAuthentication no
# 可选:禁止root密码登录(安全加固)
# PermitRootLogin prohibit-password
⚠️ 重要:先不要关闭 PasswordAuthentication! 密钥登录测试成功之后,再关闭密码登录,否则连不上服务器。
修改完重启 sshd 服务:
# CentOS / RHEL / Rocky / openEuler
systemctl restart sshd
# Debian / Ubuntu
systemctl restart ssh
四、测试密钥登录
本地执行:
ssh root@服务器IP
没设置私钥口令:直接登录成功
设置了私钥口令:输入你生成密钥时的 passphrase(不是服务器密码)
Windows PowerShell 指定私钥文件(多密钥场景)
ssh -i C:\Users\XXX\.ssh\id_ed25519 root@IP
本地配置~/.ssh/config(简化命令,推荐)
在本地 .ssh 新建 config 文件,权限 600
Host myserver
HostName 123.123.123.123
User root
IdentityFile ~/.ssh/id_ed25519
之后直接登录:
ssh myserver

五、常见踩坑排查(登不上优先看这里)
❌ 权限问题(最高发)
.ssh目录 700,authorized_keys 必须 600,不能组 / 其他可读。
# 服务器上修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh
❌ 公钥粘贴错误,多换行、多空格、少字符 公钥是一整行,不要换行!
❌ sshd 配置没生效,忘记重启 sshd
❌ 防火墙 / 安全组:22 端口不通(密钥登录端口还是 22,和密码一样)
❌ SELinux 拦截(CentOS/RHEL 常见) 查看日志:
tail -f /var/log/secure如果是 selinux 问题:
restorecon -R ~/.ssh
❌ 私钥本地权限过大(Linux/WSL) 本地私钥权限必须严格:
chmod 600 ~/.ssh/id_ed25519
查看 sshd 日志定位失败原因(神器)
# centos
tail -f /var/log/secure
# ubuntu/debian
tail -f /var/log/auth.log
六、安全加固(调试通过后执行)
确认密钥登录完全没问题,再关闭密码登录:
PasswordAuthentication no
重启 sshd。
一旦关闭密码登录,私钥丢了就无法 SSH 进服务器,云服务器记得保留控制台 VNC / 堡垒机兜底。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢