ssh密钥登录不受系统密码过期策略影响,因其走publickey认证路径,绕过pam密码校验;常见失败原因包括authorized_keys中的expiry-time限制、账户本身过期、sshd_config禁用公钥认证、selinux或权限问题。

密钥登录为何天然绕过密码过期
Linux 的密码过期机制(由 chage 管理)只作用于 PAM 模块中的 password authentication 流程,比如 PasswordAuthentication yes 或 ChallengeResponseAuthentication yes。而密钥认证走的是 publickey authentication 路径,完全跳过密码校验阶段——服务器压根不会读取 /etc/shadow 中的密码过期字段(如 passwd_max_days),也不会调用 pam_unix.so 的密码检查逻辑。
真正需要排查的 4 类干扰项
虽然密码过期不影响密钥登录,但以下情况会导致“明明配了密钥却登不上”,常被误判为“受密码策略影响”:
-
authorized_keys 文件里带了过期限制选项:比如某行公钥开头写了
expiry-time="20250101",这是 OpenSSH 自定义的时间锁,和系统密码策略无关,但会让该密钥在指定时间后彻底失效 -
账户本身被禁用或过期:执行
chage -l username查看Account expires字段。如果显示具体日期(如Jan 01, 2025),说明整个账户已停用,密钥也无法登录——这不是密码过期,而是账户生命周期结束 -
sshd_config 中禁用了公钥认证:确认
PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys未被注释或改错;同时检查AuthenticationMethods是否强制要求多因素(如publickey,password),这会间接触发密码校验 -
SELinux 或目录权限拦截:用户家目录、
.ssh目录、authorized_keys文件权限必须严格(700 / 700 / 600),否则 SELinux 或 OpenSSH 会静默拒绝密钥认证,日志里可能只显示Authentication refused,不提密码
快速验证是否真被密码策略波及
只需两步确认:
- 运行
ssh -o PubkeyAuthentication=yes -o PasswordAuthentication=no -v user@host,观察日志末尾是否出现password expired或account expired—— 如果有,说明账户级过期(非密码);如果没有,基本排除密码策略干扰 - 临时切换到另一个未设过期的普通用户(如新建 test 用户),用同一对密钥测试登录。若成功,说明原用户的问题出在账户状态或 authorized_keys 配置,而非密钥本身
附:一眼识别 authorized_keys 中的“伪过期”
进服务器执行:grep -n "expiry-time\|restrict" ~/.ssh/authorized_keys
如果输出类似:3:expiry-time="20250101T000000" ssh-rsa AAAA... user@host
那就不是密码过期,是这行公钥被主动加了时间锁,删掉或更新时间即可。











