SSH登录最后只显示 Permission denied (publickey),表示服务器允许公钥认证,但没有接受客户端尝试的任何密钥。这条信息不能单独证明私钥损坏,也不能说明22端口或防火墙有问题。
连接已经到达SSH认证阶段,定位重点应放在登录用户名、客户端实际提供的密钥、服务器端 authorized_keys、目录权限和sshd生效配置。

先用详细日志确认客户端提供了哪把密钥
使用详细模式重试,并显式指定私钥:
ssh -vvv -o IdentitiesOnly=yes \ -i ~/.ssh/id_ed25519 user@server
关注日志中的 Offering public key 与服务器是否接受。IdentitiesOnly=yes 会限制客户端只使用明确配置的身份,避免SSH Agent里大量密钥干扰判断。
日志里没有出现目标密钥,先修复客户端选择;已经提供但被拒绝,再检查服务器端。 不要仅凭文件名判断实际使用的密钥。
用户名错误会让正确密钥也失败
公钥存放在目标用户自己的授权文件中。云镜像常用账号可能是 root、ubuntu、debian、ec2-user 或平台自定义用户。先明确账号:
ssh -i ~/.ssh/id_ed25519 ubuntu@server ssh -i ~/.ssh/id_ed25519 debian@server
不要把遍历用户名当成长期做法,更不要在公网脚本中批量猜测账号。 应从云平台镜像说明、初始化配置或救援控制台确认真实用户。
核对公钥是否真的写入目标账号
通过控制台或仍可用的会话进入服务器后,检查目标用户身份和授权文件:
getent passwd user sudo -u user sh -c ‘echo “$HOME”‘ sudo -u user ls -la ~/.ssh sudo -u user ssh-keygen -lf ~/.ssh/authorized_keys
authorized_keys中的每把公钥应完整占一行。可在客户端读取私钥对应公钥的指纹:
ssh-keygen -y -f ~/.ssh/id_ed25519 | ssh-keygen -lf –
比较指纹比肉眼比较长字符串更可靠。 不要把私钥内容复制到服务器或聊天工具中。
修正目录所有者和权限
OpenSSH的 StrictModes 默认会检查用户目录与认证文件的所有权和模式。常见安全设置为:
chown -R user:user /home/user/.ssh chmod 700 /home/user/.ssh chmod 600 /home/user/.ssh/authorized_keys chmod go-w /home/user
如果家目录位于网络文件系统或启用了SELinux,还要核对挂载权限与安全上下文。不要用chmod 777解决公钥认证,过宽权限反而可能让sshd拒绝读取授权文件。
检查sshd真正生效的配置
配置可能来自主文件、包含目录或 Match 条件。使用sshd的测试模式查看结果:
sshd -t sshd -T | grep -E \ ‘pubkeyauthentication|authorizedkeysfile|strictmodes’ systemctl reload ssh || systemctl reload sshd
关键项包括 PubkeyAuthentication、AuthorizedKeysFile 和 StrictModes。先通过sshd -t再重载,不要在没有备用会话时直接重启SSH服务。
服务器日志通常会给出拒绝原因
不同发行版的日志位置不同,可优先查看systemd日志:
journalctl -u ssh -n 100 –no-pager journalctl -u sshd -n 100 –no-pager
日志可能指出授权文件权限不安全、用户被禁止、密钥算法受限或授权文件路径错误。需要复现认证流程时,可在 萤光云 创建隔离实例,或用 LightNode 按小时准备临时服务器。不要在生产机上反复放宽认证策略做试验。
修复后如何安全验收
保留原会话,另开终端验证新连接:
ssh -o IdentitiesOnly=yes \ -i ~/.ssh/id_ed25519 user@server ssh user@server ‘id; whoami’
确认新会话使用预期账号和密钥后,再清理临时公钥或备用入口。验收标准是指定密钥可稳定登录,错误密钥仍被拒绝,且未关闭StrictModes或扩大文件权限。
FAQ
为什么密码输入框都没出现?
服务器可能只允许公钥认证,或当前账号不允许密码登录。最终括号中只有publickey,表示本次允许或剩余的认证方式中没有密码。
把公钥追加到root的authorized_keys就行吗?
只有明确使用root登录且服务器允许root公钥登录时才相关。普通账号应把公钥放到该账号的授权文件中。
私钥权限也需要检查吗?
需要。客户端通常要求私钥只允许当前用户读取,可使用 chmod 600 ~/.ssh/id_ed25519,但服务器拒绝原因仍应结合详细日志确认。
温馨提示
任何SSH配置修改都应保留一个已登录会话和云平台控制台作为回退通道。 先用日志定位用户名、密钥或权限问题,再做最小修改,避免把一次认证失败扩大为整台服务器失联。


