必须先确保密钥能稳定登录,再关闭所有密码入口,最后严格校验权限与配置:1.生成ed25519密钥对并用ssh-copy-id推送;2.在sshd_config中显式设PubkeyAuthentication yes、PasswordAuthentication no等五项;3.确认~/.ssh权限700、authorized_keys权限600,sshd -t校验无误后reload服务。

要让Linux服务器只接受SSH公钥登录、彻底拒绝密码认证,必须先确保密钥能稳定登录,再关闭所有密码入口,最后严格校验权限与配置——三步缺一不可,跳过任一环节都可能被锁在系统外。
第一步:生成并部署可用的密钥对
在本地机器运行:ssh-keygen -t ed25519 -C "admin@prod"。ed25519比RSA更安全、签名更快,且默认不带弱算法兼容包袱。
用ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip一键推送公钥。它会自动创建~/.ssh目录、写入authorized_keys、并设好700/600权限——手动操作容易漏掉某一项,导致后续静默失败。
新开终端执行ssh user@server_ip测试。不输密码能成功登录,才算密钥真正就绪。【当前终端务必保持连接不断,这是唯一逃生通道】
第二步:关闭全部密码类认证方式
编辑/etc/ssh/sshd_config,逐行确认以下配置已取消注释并设为no:
PasswordAuthentication no
PermitEmptyPasswords no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM no
显式启用密钥认证:PubkeyAuthentication yes。别依赖默认值,OpenSSH某些版本默认关闭此选项。
限制root登录方式:PermitRootLogin prohibit-password。允许root用密钥进,但彻底堵死密码路径。
检查AuthorizedKeysFile是否为.ssh/authorized_keys(通常不用改,但若被覆盖成其他路径,密钥将永远不生效)。
第三步:权限检查与服务重载
第一步:确认用户家目录权限不能是777或含sticky bit(如1755),否则sshd会跳过读取.ssh目录,且不报错。
第二步:执行chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys。权限不对是密钥登录失败最常见原因,比配置错误还高频。
第三步:运行sudo sshd -t做语法校验。无任何输出才代表配置合法;若有报错,必须修正后再继续。
第四步:执行sudo systemctl reload sshd。用reload而非restart,避免主进程意外中断导致连接闪断。
第五步:另开终端验证:
✅ ssh user@server_ip仍能免密登录
❌ ssh -o PubkeyAuthentication=no user@server_ip应提示Permission denied (publickey)


















