1)检查是否已有密钥

ls ~/.ssh

常见文件:

  • id_ed25519
  • id_ed25519.pub
  • id_rsa
  • id_rsa.pub

如果有则不用创建新的,把后缀名为 pub 的内容复制下来,没有则需要创建新的


2)创建新 SSH 密钥(推荐 ed25519)

ssh-keygen -t ed25519 -C "you@example.com"

回车三次即可。

生成位置默认:

~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub

3)复制公钥内容

cat ~/.ssh/id_ed25519.pub

Ubuntu 服务器禁用 Ssh 密码链接

最稳妥的做法是:先确认你已经能用 SSH 密钥登录,再禁用密码登录。Ubuntu 的 OpenSSH 服务配置文件是 /etc/ssh/sshd_config,而且现在默认会先包含 /etc/ssh/sshd_config.d/*.conf 里的片段;PasswordAuthentication 这个选项就是控制是否允许密码认证的。sshd 在加载配置时通常 ” 先读到的值生效 “,所以用单独的 .conf 片段来改,通常比直接乱改主文件更稳。

直接按这个做:

# 1) 先确认你当前会话是能用密钥登上的,别先断当前连接
# 2) 新建一个配置片段,禁用密码登录
sudo mkdir -p /etc/ssh/sshd_config.d
 
printf '%s\n' \
'PasswordAuthentication no' \
'KbdInteractiveAuthentication no' \
'PubkeyAuthentication yes' \
| sudo tee /etc/ssh/sshd_config.d/99-disable-password.conf

这里把 KbdInteractiveAuthentication 也一起关掉,是因为在启用 PAM 时,交互式认证和密码认证可能都参与 SSH 登录流程;只关 PasswordAuthentication 有时不够干净。

然后先检查配置有没有写坏:

sudo sshd -t

如果这条命令没有输出,一般就是语法没问题。接着重载 SSH 服务:

sudo systemctl reload ssh

sshd 支持重新读取配置;Ubuntu 的 OpenSSH 服务文档也明确建议改完先检查配置,再重启或重载服务。

最后一定要另开一个终端测试,别先关掉你当前这个 SSH 会话:

# 测试公钥登录是否正常
ssh youruser@your-server

还可以顺手测试 ” 密码登录是否真的被禁用 ”:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no youruser@your-server

如果配置生效,这种强制走密码的方式应该登录失败。PasswordAuthentication no 的作用就是禁止密码认证;而公钥认证由 PubkeyAuthentication 控制。

再给你一个很实用的检查命令,看看当前 sshd 实际生效的相关选项:

sudo sshd -T | grep -E 'passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|usepam'

你应该能看到类似:

passwordauthentication no
kbdinteractiveauthentication no
pubkeyauthentication yes

别在没验证公钥可用之前就退出当前 SSH 连接,不然很容易把自己锁在服务器外面。Ubuntu 也明确提醒:改 SSH 配置前后要谨慎检查,因为 SSH 往往就是你唯一的远程入口。