跳转到内容
搜索 CentOS Stream 文档

    浏览当前文档目录

    配置 SSH 密钥登录并关闭口令登录

    适用:CentOS Stream 9 / 10(OpenSSH 9.9p1 实测)· 核对日:2026-11-01 · 官方依据:sshd_config(5) 与系统自带配置文件栈。

    关掉口令登录是装机后性价比最高的安全动作,前提是先把密钥通道打通并验证——顺序反了就是把自己锁在门外。本页的每一步都在 Stream 9 容器实测过,包括「密码被拒」的对照验证。

    • 能通过现有方式登录目标机(口令 SSH 或本地控制台);
    • 准备第二个会话保持登录状态,改配置期间不要全部退出——这是远程改 sshd 的标准保命手段;
    • 回退点:改动前备份 /etc/ssh/sshd_config 与 drop-in 目录。
    1. 在客户端生成密钥(已有 ed25519 密钥可跳过):

      生成 ed25519 密钥对
      $ ssh-keygen -t ed25519 -C "you@host"

      预期:~/.ssh/id_ed25519(私钥)与 id_ed25519.pub(公钥)生成;passphrase 建议设置。

    2. 把公钥部署到服务器:

      一键部署公钥(还输得进口令时最省事)
      $ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

      手动等价操作(服务器端):

      手动部署 authorized_keys
      $ mkdir -p ~/.ssh && chmod 700 ~/.ssh
      $ echo '<你的公钥一行>' >> ~/.ssh/authorized_keys
      $ chmod 600 ~/.ssh/authorized_keys

      权限是密钥登录最常见的失败原因:~/.ssh 必须 700,authorized_keys 必须 600,home 目录不能对组/其他人可写。

    3. 先验证密钥能登录,再谈关口令:

      验证密钥登录(新开会话)
      $ ssh -i ~/.ssh/id_ed25519 user@server 'echo KEY-LOGIN-OK'

      预期输出(实测摘录):

      KEY-LOGIN-OK
    4. 核对生效配置:

      查看合并后的有效值
      $ sudo sshd -T | grep -E '^(passwordauthentication|pubkeyauthentication|permitrootlogin)'

      预期输出(实测摘录,新装机默认):

      passwordauthentication yes
      pubkeyauthentication yes
      permitrootlogin without-password

      drop-in 优先级提醒:sshd_config 的 Include /etc/ssh/sshd_config.d/*.conf 在文件最前面,OpenSSH 取第一次出现的值,所以 drop-in 里的行会压过主文件后面的同名行。想在主文件里改口令开关却看不到效果时,先查 drop-in。

    5. 关闭口令登录:

      写入 drop-in(推荐,别改主文件)
      $ echo 'PasswordAuthentication no' | sudo tee /etc/ssh/sshd_config.d/99-disable-password.conf
      $ sudo sshd -t && sudo systemctl reload sshd

      sshd -t 无输出即语法正确;reload 不断开现有会话。

    6. 验证口令真的被拒(开新会话,别用当前会话):

      Terminal window
      $ ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password user@server

      预期输出(实测摘录):

      Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

      括号里的认证方式列表不再包含 password,即关闭生效。同时用第 3 步的命令确认密钥登录仍正常。

    新装机的默认值里 permitrootlogin without-password 已经禁止 root 口令登录,只放行密钥。是否进一步收紧成 prohibit-password 以外的值(如完全 no、改用普通用户 + sudo)是运维策略问题:个人 VPS 常用「专用管理用户 + sudo」,多机环境常配合自动化工具使用固定管理账号。改这个值同样走 drop-in + sshd -T 验证的流程。

    恢复口令登录
    $ sudo rm /etc/ssh/sshd_config.d/99-disable-password.conf
    $ sudo sshd -t && sudo systemctl reload sshd
    $ sudo sshd -T | grep ^passwordauthentication

    预期回到 passwordauthentication yes。密钥通道不受影响,无需回退。

    现象原因处理
    公钥部署了仍要口令权限不对或 SELinux 上下文丢失查 ~/.ssh 700/文件 600;restorecon -Rv ~/.ssh
    改了主配置没生效drop-in 里的同名行先生效sshd -T 看有效值;改动写进 drop-in
    reload 后新会话连不上语法错误或 SELinux 拦截用保命会话回滚 drop-in;journalctl -u sshd -n 20
    密钥登录提示 refused客户端未提供正确私钥ssh -v 看 offer 的密钥;确认 -i 指向私钥