连接 VPS 提示 Permission denied (publickey) 通常是因为客户端私钥权限设置过宽或服务器端未正确授权公钥。最推荐先检查本地私钥文件权限是否为 600,再确认服务器 ~/.ssh/authorized_keys 是否包含对应公钥内容。适用场景为 SSH 密钥认证失败,风险边界是不要随意放宽文件权限否则 SSH 客户端会拒绝加载密钥。
先说结论:该错误表明 SSH 服务端拒绝了公钥认证流程,需重点排查客户端私钥权限与服务端授权文件配置。
- 先确认本地私钥权限是否为 600 且目录为 700
- 先处理服务器端 authorized_keys 文件内容与归属
- 再验证 SSH 连接调试日志确认密钥加载状态
命令速用版
以下命令用于快速修复常见的权限问题,请在本地终端和服务端分别执行:
# 本地修复私钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
# 服务端修复授权文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh
# 使用调试模式连接
ssh -v user@host为什么会这样
SSH 协议出于安全考虑,强制要求私钥文件只能由所有者读写,且服务端必须严格匹配公钥指纹。
当本地私钥权限包含组或其他用户的读写权限时,SSH 客户端会主动拒绝加载该密钥。当服务端 ~/.ssh 目录或 authorized_keys 文件权限过宽(如 777)时,SSH 服务端守护进程会忽略该文件以防止安全风险。此外,若公钥内容未正确写入或换行符异常,也会导致指纹匹配失败。
分步处理
步骤 1:检查客户端私钥权限
在本地计算机执行 ls -l ~/.ssh/id_rsa,确认权限显示为 -rw-------。若权限不对,执行 chmod 600 ~/.ssh/id_rsa。若私钥文件名非默认(如 private_key),需通过 ssh -i 指定或使用 SSH Config 配置 IdentityFile。
步骤 2:检查服务端授权文件
登录服务器(若无法 SSH 登录需通过控制台 VNC 访问),检查 ~/.ssh/authorized_keys 是否存在且包含本地 id_rsa.pub 的公钥内容。执行 chmod 600 ~/.ssh/authorized_keys 确保权限严格。
步骤 3:检查服务端 SSH 配置
查看 /etc/ssh/sshd_config 文件,确认 PubkeyAuthentication 设置为 yes。若修改了配置,需执行 systemctl restart sshd 重启服务。注意检查 PermitRootLogin 设置,若为 prohibit-password 则 root 用户必须使用密钥登录。
怎么验证是否生效
使用 ssh -v user@host 命令连接,观察输出日志。若看到 debug1: Offering public key: ... 且后续没有 Permission denied 报错,说明密钥已被加载并尝试认证。若看到 debug1: Server accepts key,则表示认证通过。
也可查看服务端日志 /var/log/auth.log 或 /var/log/secure,确认是否有 Accepted publickey 记录。
常见坑
- 用户主目录权限过宽:/home/username 权限若为 777,SSH 服务端可能拒绝认证,建议设置为 755。
- SELinux 干预:在 CentOS/RHEL 系统中,SELinux 可能阻止 SSH 读取密钥文件,可尝试 setenforce 0 测试。
- 密钥格式不兼容:旧版 PEM 格式密钥在新版 OpenSSH 中可能受限,建议使用 ssh-keygen -l -f 检查密钥指纹。
- ssh-agent 缓存干扰:若本地 ssh-agent 加载了错误密钥,执行 ssh-add -d 清空后重试。
常见问题
为什么指定 -i 参数能连,直接连不行?
因为 SSH 客户端默认只加载 id_rsa 等标准命名的密钥,非标准命名需显式指定或通过 Config 配置。
服务器禁止密码登录怎么办?
若 PasswordAuthentication 为 no 且密钥失效,需通过云厂商控制台重置密钥或使用 VNC 控制台进入系统修复。
root 用户无法密钥登录是什么原因?
检查 sshd_config 中 PermitRootLogin 设置,若为 no 则禁止 root 登录,建议创建普通用户提权操作。
参考来源
- CSDN 问答:SSH 登录时提示"Permission denied (publickey)",如何排查?
- CSDN 问答:SSH 连接时提示"Permission denied (publickey)",如何解决?
- 阿里云开发者社区:【MAC】使用 SSH 公钥登录服务器报错 Permission denied (publickey) 解决方案
- 博客园:深度解析:SSH"Permission denied (publickey,gssapi-keyex,gssapi-with-mic)"错误及完整解决方案