场景:用 Xshell 密钥登录 Linux 报错
Permission denied (publickey)/Server refused our key。 原理:私钥留在你 Windows 的 Xshell 里,公钥必须放到服务器上对应用户的~/.ssh/authorized_keys。任何一环权限 / 路径不对都会失败。
一、整体流程
Windows 本地生成密钥对(公钥+私钥)
↓
公钥上传到服务器:/home/用户/.ssh/authorized_keys
↓
修正权限 + 重启 sshd
↓
Xshell 导入私钥,连接
二、第一步:本地生成密钥对
方式 A:Xshell 图形化生成(推荐新手)
- Xshell 菜单 →
工具→新建用户密钥生成向导 - 参数:
- 密钥类型:RSA(或 Ed25519,更短更安全)
- 密钥长度:2048(或 4096)
- 一路下一步,生成后会看到公钥指纹和公钥内容
- 点击
保存为文件导出私钥(.xsh或.ppk格式) - 复制公钥内容(一长串
ssh-rsa AAAA...),下一步要用
方式 B:用 OpenSSH 命令生成(PowerShell 或 Git Bash)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或 RSA
ssh-keygen -t rsa -b 4096
一路回车(passphrase 可留空,建议设口令),生成两个文件:
C:\Users\你\.ssh\id_ed25519(私钥,绝对不能泄露)C:\Users\你\.ssh\id_ed25519.pub(公钥,上传到服务器)
三、第二步:把公钥注册到服务器(关键!)
先用密码登录服务器(能登密码就行),切换到目标用户:
# 假设要给普通用户 zhangsan 配密钥
su - zhangsan
cd ~
1. 创建 .ssh 目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh
2. 把公钥写入 authorized_keys
用 vi 打开(或 nano):
vi ~/.ssh/authorized_keys
把第一步复制的公钥内容粘贴成一行保存。
一行就是一个公钥;多个用户就一行一个。
3. 严格设置权限(90% 报错都是这里!)
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 700 ~
# 或者把家目录下其它写权限去掉
chmod go-w ~
⚠️ 如果用 root 给 zhangsan 操作,属主必须改回 zhangsan:
chown -R zhangsan:zhangsan ~/.ssh
四、第三步:确认 sshd 允许密钥登录
vi /etc/ssh/sshd_config
确认 / 修改以下项:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 如果想关掉密码登录(更安全,配好密钥后再关)
# PasswordAuthentication no
重启 sshd:
systemctl restart sshd
⚠️ 操作前保留一个已登录的窗口,万一配置错能改回来。
五、第四步:Xshell 导入私钥连接
- Xshell 新建会话:
- 主机:服务器 IP
- 端口:22
- 左侧
用户身份验证:- 方法:Public Key
- 用户密钥:下拉选刚才导入的私钥;没有就点
浏览→用户密钥管理者→导入选.xsh/.ppk/id_rsa文件 - 用户名:填服务器上的用户名(zhangsan /root)
- 连接,应该直接进,不用密码。
六、常见报错与排查
报错 1:Permission denied (publickey)
按顺序检查:
- 权限对不对(最常见):
ls -ld ~ ~/.ssh ~/.ssh/authorized_keys
# 期望:
# ~ 700 (drwx------)
# ~/.ssh 700
# authorized_keys 600 (-rw-------)
- 属主对不对:
ls -l ~/.ssh/,必须是目标用户自己,不是 root。 - 公钥格式对不对:一行完整的
ssh-xxx AAAA...注释,不能换行、不能多空格。 - SELinux 拦截(CentOS7 容易忽略):
ls -Z ~/.ssh/authorized_keys
# 应该看到 ssh_home_t 类型
# 如果不是,执行:
restorecon -Rv ~/.ssh
报错 2:Server refused our key
- 服务器
/var/log/secure看原因:
tail -f /var/log/secure
常见日志:
Authentication refused: bad ownership or modes for directory /home/xxx→ 权限问题Received disconnect: Too many authentication failures→ 试太多次,Xshell 里关掉多余认证方法
报错 3:Windows 下用 ssh -v 调试
ssh -v zhangsan@服务器IP
看 debug1: Offering public key 后面服务器怎么回应。如果一直 Authentications that can continue: publickey,说明公钥没被服务器接受。
七、推荐安全加固(配好密钥后再做)
# 编辑 sshd_config
vi /etc/ssh/sshd_config
# 禁止root直接登录
PermitRootLogin no
# 禁止密码登录(确认密钥能用后再开!)
PasswordAuthentication no
# 改SSH端口(可选)
Port 2222
systemctl restart sshd
⚠️ 改之前另开一个终端测试新配置能登录,别把自己锁外面。
八、一键自动部署公钥(本地命令,不用手改)
如果你本地有私钥,想自动推到服务器:
ssh-copy-id zhangsan@服务器IP
自动把 ~/.ssh/id_*.pub 追加到服务器 ~/.ssh/authorized_keys 并设好权限。
九、排障检查清单
- 本地私钥和服务器公钥是一对(不是从别处复制来的)
- 公钥在正确用户家目录的
.ssh/authorized_keys - 家目录 700、.ssh 700、authorized_keys 600
- 属主是该用户,不是 root
- SELinux 已
restorecon - sshd 配置
PubkeyAuthentication yes - 防火墙 / 安全组放行 22 端口
- Xshell 导入的私钥和公钥配对
十、速查命令
# 服务器端看登录失败原因
tail -f /var/log/secure
# 检查权限
ls -ld ~ ~/.ssh ~/.ssh/authorized_keys
# 修权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 修SELinux
restorecon -Rv ~/.ssh
# 重启sshd
systemctl restart sshd
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容