“Permission denied (publickey)”表明已进入SSH公钥认证阶段但服务端拒绝公钥,需排查密钥配对性、authorized_keys格式(如空格、换行、编码)、私钥权限(600)、sshd_config中PubkeyAuthentication是否启用及StrictModes权限校验。

先看报错类型,锁定问题层级
SSH 和 RDP 是两类协议,密钥格式错误只影响 SSH 公钥认证,RDP 不用 SSH 密钥。如果看到 Permission denied (publickey),说明已进入认证阶段,但服务端拒绝了你提供的公钥;如果报错是 Connection refused 或 Connection timed out,那根本没到密钥环节,不用查格式——先确认网络、端口、sshd 是否运行。
检查公钥内容是否真正“合法”
OpenSSH 对 authorized_keys 中的每一行都做严格校验:格式错一个字符就静默跳过,不报错也不提示。常见无效情况包括:
- 手动复制时带了多余空格、换行符或中文标点(比如把
ssh-ed25519 AAAA...粘贴成两行) - 开头少了密钥类型标识(必须是
ssh-rsa、ssh-ed25519或ecdsa-sha2-nistp256等) - 末尾邮箱或注释含非法字符(如未转义的
@、#、单引号) - 文件用了 Windows 编码(CRLF 换行)或带 BOM 的 UTF-8,导致解析失败
验证方法:在服务器上执行 ssh-keygen -lf ~/.ssh/authorized_keys。若某行无效,该命令会直接报错并指出第几行有问题;若无输出,说明所有公钥都通过基础格式校验。
确认私钥与公钥是否真正配对
客户端用的私钥,必须和你塞进 authorized_keys 的公钥来自同一对密钥。常见误操作:
- 生成了多组密钥(
id_rsa、id_ed25519),但 ssh 默认只尝试id_rsa,而你放上去的是 ed25519 公钥 - 用
ssh-keygen -p改过私钥口令,但没同步更新公钥(其实不用重生成,公钥不变) - 私钥被意外覆盖或损坏(可用
ssh-keygen -l -f ~/.ssh/id_ed25519查看指纹,再和authorized_keys里对应行比对)
强制指定密钥测试:ssh -i ~/.ssh/id_ed25519 -v user@host,观察日志中 “Offering public key” 后是否跟对了指纹。
RDP 场景下无需排查 SSH 密钥格式
RDP 登录走的是 Windows 认证体系(NTLM/Kerberos),和 OpenSSH 密钥完全无关。如果你在连 Windows 服务器时遇到“拒绝访问”或“用户未授权”,应排查:
- 目标用户是否已加入 Remote Desktop Users 组
- 组策略中是否启用“允许通过远程桌面服务登录”
- 防火墙是否放行 3389 端口(而非 22)
- 是否启用了网络级身份验证(NLA),而客户端不支持
此时看到任何和 “publickey” 相关的提示,基本可断定你连错了协议——比如误用 ssh 命令去连 RDP 端口,或用 RDP 客户端输进了 SSH 私钥路径。

















