公钥登录失败的检查顺序
公钥认证涉及四组条件:客户端持有私钥与对应公钥、服务端该账号的授权文件里有正确公钥、服务端对家目录与授权文件的权限要求被满足、安全模块对文件上下文的判定通过。任意一项不满足,客户端得到的报错都相似,因此要按固定顺序逐项确认。
权限为什么这么严格
服务端会主动检查家目录与授权文件的属主和权限,如果目录对其他人可写,任何本地用户都可以往里添加自己的公钥,认证机制就形同虚设。这就是家目录权限过宽时服务端直接拒绝密钥认证的原因,与公钥内容是否正确无关。
基本信息
| 客户端文件 | 私钥与对应公钥,需严格控制权限 |
|---|---|
| 服务端文件 | 用户家目录下的授权文件,权限需设为仅本人可读写 |
| 目录权限 | 家目录与配置目录不能对其他人可写 |
| 安全模块 | 启用强制访问控制时需核对文件上下文 |
典型使用场景
- 新配置密钥登录后仍提示需要输入密码
- 从其他机器复制密钥后认证失败
- 迁移或恢复家目录后原有密钥失效
- 安全加固收紧权限后部分账号密钥登录失败
- 批量分发公钥时个别机器不生效
服务端检查
服务端检查
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 # 代理中的密钥列表失败原因与处置
| 原因 | 表现 | 处置 |
|---|---|---|
| 公钥未写入授权文件 | 客户端提示没有可用认证方式 | 把公钥内容正确追加到授权文件 |
| 家目录权限过宽 | 服务端拒绝使用密钥 | 收紧目录权限为仅本人可写 |
| 文件属主错误 | 认证不通过且日志有相关提示 | 恢复属主为对应用户 |
| 文件上下文不符 | 启用强制访问控制时被拒 | 恢复文件上下文 |
| 客户端密钥过多 | 逐个尝试后失败或被拒 | 指定密钥并限制尝试范围 |
家目录权限过宽时服务端会拒绝密钥登录,修复方向是收紧权限,而不是关闭服务端的严格检查;关闭检查等于让任何本地用户都能添加自己的公钥。