Xshell密钥错误解决指南 如何在远程主机上注册用户密钥

场景:用 Xshell 密钥登录 Linux 报错 Permission denied (publickey) / Server refused our key。 原理:私钥留在你 Windows 的 Xshell 里,公钥必须放到服务器上对应用户的 ~/.ssh/authorized_keys。任何一环权限 / 路径不对都会失败。

一、整体流程

Windows 本地生成密钥对(公钥+私钥)
        ↓
公钥上传到服务器:/home/用户/.ssh/authorized_keys
        ↓
修正权限 + 重启 sshd
        ↓
Xshell 导入私钥,连接

二、第一步:本地生成密钥对

方式 A:Xshell 图形化生成(推荐新手)

  1. Xshell 菜单 → 工具 → 新建用户密钥生成向导
  2. 参数:
    • 密钥类型:RSA(或 Ed25519,更短更安全)
    • 密钥长度:2048(或 4096)
  3. 一路下一步,生成后会看到公钥指纹和公钥内容
  4. 点击 保存为文件 导出私钥(.xsh 或 .ppk 格式)
  5. 复制公钥内容(一长串 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 导入私钥连接

  1. Xshell 新建会话:
    • 主机:服务器 IP
    • 端口:22
  2. 左侧 用户身份验证:
    • 方法:Public Key
    • 用户密钥:下拉选刚才导入的私钥;没有就点 浏览 → 用户密钥管理者 → 导入 选 .xsh/.ppk/id_rsa 文件
    • 用户名:填服务器上的用户名(zhangsan /root)
  3. 连接,应该直接进,不用密码。

六、常见报错与排查

报错 1:Permission denied (publickey)

按顺序检查:

  1. 权限对不对(最常见):
ls -ld ~ ~/.ssh ~/.ssh/authorized_keys
# 期望:
# ~               700 (drwx------)
# ~/.ssh          700
# authorized_keys 600 (-rw-------)
  1. 属主对不对:ls -l ~/.ssh/,必须是目标用户自己,不是 root。
  2. 公钥格式对不对:一行完整的 ssh-xxx AAAA...注释,不能换行、不能多空格。
  3. 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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像-次元社
欢迎您留下宝贵的见解!
提交
头像-次元社

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容