要让ssh完全依赖密钥认证并彻底关闭密码登录,必须同步启用pubkeyauthentication、禁用passwordauthentication等五项口令认证选项、确保~/.ssh权限为700且authorized_keys为600、验证公钥格式正确,并重启sshd后测试无误。

要让 SSH 完全依赖密钥认证、彻底关闭密码登录,关键不是只打开 PubkeyAuthentication,而是同步收紧服务端配置、权限控制和认证链路。以下步骤缺一不可,顺序也不能颠倒。
确认并启用公钥认证开关
编辑 /etc/ssh/sshd_config,确保以下三行明确启用且未被注释:
PubkeyAuthentication yes-
AuthorizedKeysFile .ssh/authorized_keys(路径必须与实际一致,不建议改) -
PermitRootLogin prohibit-password或without-password(若需 root 密钥登录)
注意:RSAAuthentication 在 OpenSSH 7.0+ 已废弃,无需设置;仅保留 PubkeyAuthentication 即可支持 RSA/ECDSA/Ed25519 等所有现代密钥类型。
强制禁用全部口令类认证方式
在同一配置文件中,必须显式关闭以下五项(哪怕默认是 no,也建议写明):
PasswordAuthentication noChallengeResponseAuthentication noKbdInteractiveAuthentication no-
UsePAM no(关键!PAM 可能绕过密码禁用策略,如必须开 PAM,请确保/etc/pam.d/sshd中无 password 模块) -
PermitEmptyPasswords no(防止空口令意外生效)
改完后务必执行 sudo systemctl restart sshd,并用 sudo ss -tlnp | grep :22 确认新进程已加载配置。
验证密钥就位且权限合规
免密登录失败的主因常是权限错误,而非配置本身。请逐项检查目标用户家目录下的 SSH 目录结构:
-
~/.ssh目录权限必须为700(drwx------) -
~/.ssh/authorized_keys文件权限必须为600(-rw-------) - 该文件所有者必须是当前登录用户,不能是 root(除非你正以 root 身份登录)
- 公钥内容须完整粘贴,末尾不能有多余空格或换行,格式形如
ssh-ed25519 AAAA... user@host
可一键校验并修复:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && chown $USER:$USER ~/.ssh ~/.ssh/authorized_keys
连接测试与安全收尾
在重启 sshd 后,立即用新终端测试,**不要关闭当前会话**:
- 先验证密钥是否有效:
ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no user@host - 确认成功后,再执行最终一步:将
PasswordAuthentication no等配置永久生效 - 建议额外设置
MaxAuthTries 2和LoginGraceTime 30进一步限制暴力尝试窗口
完成之后,任何试图用密码登录的行为都会被服务端直接拒绝,SSH 认证层只剩私钥这唯一入口。











