Skip to content
Search CentOS Stream

This page uses Chinese content. Search opens the Chinese documentation.

    Browse this documentation

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

    This content is not available in your language yet.

    适用: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 指向私钥