首页/系统/信创系统运维速查/公钥登录失败的排查
常见问题65 条

公钥登录失败的排查

公钥登录失败按链路查:客户端密钥、服务端 authorized_keys 与权限、家目录权限、SELinux 上下文,最后看 sshd 日志确认原因。

信创系统运维速查系统更新于 2026-10-13

公钥登录失败的检查顺序

公钥认证涉及四组条件:客户端持有私钥与对应公钥、服务端该账号的授权文件里有正确公钥、服务端对家目录与授权文件的权限要求被满足、安全模块对文件上下文的判定通过。任意一项不满足,客户端得到的报错都相似,因此要按固定顺序逐项确认。

权限为什么这么严格

服务端会主动检查家目录与授权文件的属主和权限,如果目录对其他人可写,任何本地用户都可以往里添加自己的公钥,认证机制就形同虚设。这就是家目录权限过宽时服务端直接拒绝密钥认证的原因,与公钥内容是否正确无关。

基本信息

客户端文件私钥与对应公钥,需严格控制权限
服务端文件用户家目录下的授权文件,权限需设为仅本人可读写
目录权限家目录与配置目录不能对其他人可写
安全模块启用强制访问控制时需核对文件上下文

典型使用场景

  • 新配置密钥登录后仍提示需要输入密码
  • 从其他机器复制密钥后认证失败
  • 迁移或恢复家目录后原有密钥失效
  • 安全加固收紧权限后部分账号密钥登录失败
  • 批量分发公钥时个别机器不生效

服务端检查

服务端检查
ls -ld ~ ~/.ssh                               # 目录属主与权限是否符合要求
ls -l ~/.ssh/authorized_keys                  # 文件权限应为仅本人可读写
head -3 ~/.ssh/authorized_keys                # 公钥内容与完整性
restorecon -Rv ~/.ssh 2>/dev/null || true      # 启用强制访问控制时恢复文件上下文
journalctl -u sshd --since '5 min ago' | tail -20

客户端检查

客户端检查
ssh -vvv -i ~/.ssh/id_ed25519 user@host 2>&1 | grep -iE 'offering|accept|deny|no mutual' | head
ssh-keygen -l -f ~/.ssh/id_ed25519.pub         # 公钥指纹,与服务端内容比对
ls -l ~/.ssh/id_ed25519                        # 私钥权限需严格
ssh-add -l 2>/dev/null                         # 代理中的密钥列表

失败原因与处置

原因表现处置
公钥未写入授权文件客户端提示没有可用认证方式把公钥内容正确追加到授权文件
家目录权限过宽服务端拒绝使用密钥收紧目录权限为仅本人可写
文件属主错误认证不通过且日志有相关提示恢复属主为对应用户
文件上下文不符启用强制访问控制时被拒恢复文件上下文
客户端密钥过多逐个尝试后失败或被拒指定密钥并限制尝试范围
家目录权限过宽时服务端会拒绝密钥登录,修复方向是收紧权限,而不是关闭服务端的严格检查;关闭检查等于让任何本地用户都能添加自己的公钥。

易错点

  • 只核对授权文件内容不查目录权限,权限过宽的场景下密钥永远不生效
  • 从其他系统复制密钥时保留了回车符或额外字符,公钥格式被破坏
  • 授权文件属主错误,内容完全正确但认证仍被拒绝
  • 遇到失败就关闭服务端的严格检查开关,牺牲安全性换取一次登录成功

数据来源与参考

  • man 5 sshd_config
  • man 1 ssh-keygen
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌