把密码登录换成了密钥,结果新密钥也连不上,提示 Permission denied (publickey)。密钥本身没问题,多半是文件权限或服务端开关。

权限必须收紧

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~
restorecon -R ~/.ssh

SSH 对权限非常敏感,家目录或 .ssh 允许其他人写入时会直接忽略公钥。最后一条是 CentOS 上 SELinux 的上下文修复,缺了它文件权限对也登不上。

确认服务端允许公钥认证

grep -E "PubkeyAuthentication|AuthorizedKeysFile" \
  /etc/ssh/sshd_config
sshd -t && systemctl reload sshd

PubkeyAuthentication 必须是 yes,AuthorizedKeysFile 指向的路径要和实际文件一致。某些发行版的配置分片放在 sshd_config.d 目录,改主文件会被覆盖。

用详细模式看握手过程

ssh -vvv 用户名@服务器IP 2>&1 | grep -i "publickey\|offering"

看客户端有没有真的把密钥发出去。只试了密码就结束,说明本地配置里没指定这个文件,或者 agent 里加载的是另一把。

改配置前务必保留一个已登录的会话,避免改错之后彻底进不去。

云服务器还有一种情况

平台提供了密钥对绑定功能,绑定后会替换实例内的公钥。自己手动往文件里加的密钥,可能在重启或重置密码时被平台覆盖。用控制台绑定密钥对,比手工编辑更稳。

另外检查登录用户名,Ubuntu 默认是 ubuntu 而不是 root,密钥对同一把,用户名错了同样报 publickey 失败。

如果所有配置都对仍不通,用云厂商的远程连接功能登进去看 auth.log,日志会明确写出拒绝原因和尝试过的公钥指纹。

作者 9823189