Zenith Horizon

Linux SSH 密钥登录指南

2026/03/21
loading

在 Ubuntu/Debian 等 Linux 系统中,实现SSH 密钥登录涉及生成密钥对、配置密钥认证、修改SSH服务配置等步骤。以下是详细操作指南。


一、生成 SSH 密钥对

使用 ssh-keygen​ 命令生成。推荐使用更安全的 Ed25519 算法(如果系统支持),否则使用 RSA 4096 位。

1. 生成 Ed25519 密钥(推荐)

ssh-keygen -t ed25519 -C "your_email@example.com"
  • ​-t ed25519​:指定密钥类型。

  • ​-C "注释"​:通常填写邮箱或用途说明,便于识别。

2. 生成 RSA 密钥(兼容性更好)

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • ​-b 4096​:指定密钥长度(默认 3072,推荐 4096)。

3. 交互过程

  • ​保存位置​:默认保存在 ~/.ssh/​ 目录,文件名如 id_ed25519​(私钥)和 id_ed25519.pub​(公钥)。直接按回车使用默认路径。

  • ​密码短语​:建议设置一个强密码,增加安全性。按回车跳过则无密码。

生成后,会在 ~/.ssh/​ 目录下得到两个文件:

  • 私钥(如 id_ed25519​):必须保密,不要泄露。

  • 公钥(如 id_ed25519.pub​):可公开,用于配置远程服务器。


二、使用 SSH 密钥进行认证

1. 将公钥添加到远程服务器

方法一:使用 ssh-copy-id​(最简单)

ssh-copy-id user@remote_host
  • 该命令会将本地默认公钥~/.ssh/id_*.pub​)追加到远程服务器的 ~/.ssh/authorized_keys​ 文件中,并自动设置正确权限。

方法二:手动复制

cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

然后确保远程服务器上 ~/.ssh​ 目录和 authorized_keys​ 文件权限正确:

ssh user@remote_host "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

2. 测试 SSH 密钥登录

ssh user@remote_host

如果设置了密码短语,会提示输入。若未设置且配置正确,应直接登录成功。

3. (可选)使用 ssh-agent​ 管理私钥

如果私钥设置了密码短语,不想每次输入,可将私钥添加到 ssh-agent​:

eval "$(ssh-agent -s)"          # 启动 agent
ssh-add ~/.ssh/id_ed25519       # 添加私钥,输入一次密码

之后本次会话中所有 SSH 连接都不会再要求输入密码。


三、常见问题与注意事项

  1. 权限问题

    • 私钥权限必须为 600​chmod 600 ~/.ssh/id_ed25519

    • ​~/.ssh​ 目录权限应为 700​chmod 700 ~/.ssh

    • 若权限过宽,SSH 会拒绝使用该私钥。

  2. 公钥格式
    公钥是一行文本,通常以 ssh-ed25519​ssh-rsa​ 开头,后面跟着密钥字符串和注释。
    不要修改公钥文件内容,否则无法使用。

  3. 多密钥管理
    可以在 ~/.ssh/config​ 中为不同主机指定使用不同私钥:

    Host github.com
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_github
    
    Host myserver
        HostName 192.168.1.100
        User admin
        IdentityFile ~/.ssh/id_rsa_legacy
    
  4. 检查本地 SSH 代理
    若遇到 Permission denied (publickey)​,可尝试:

    ssh -vT user@remote_host   # 查看详细调试信息
    

要配置 OpenSSH 服务器仅允许密钥登录并关闭密码登录,需要修改 SSH 服务端的配置文件 /etc/ssh/sshd_config​,并重启服务。以下是详细步骤,适用于 Ubuntu/Debian 系统。


四、修改 SSH 服务端配置

操作前的重要提醒

在禁用密码登录之前,请确保:

  • 您已经将本地公钥正确添加到了服务器的 ~/.ssh/authorized_keys​ 文件中。

  • 您已经使用密钥成功登录过一次,以验证配置正确。

  • 保持一个已登录的终端会话(如通过现有 SSH 连接)作为“保底”,防止配置错误导致无法登录。


1. 编辑 SSH 服务端配置文件

使用 root 或具有 sudo 权限的用户编辑 /etc/ssh/sshd_config​:

sudo nano /etc/ssh/sshd_config

2. 修改相关配置项

找到并设置以下指令(如果文件中没有,则手动添加):

# 禁用密码认证(核心设置)
PasswordAuthentication no

# 禁用质询-响应认证(避免某些情况下仍然允许密码)
ChallengeResponseAuthentication no

# 确保公钥认证已启用(默认即为 yes,可显式设置)
PubkeyAuthentication yes

# (可选)如果系统使用了 PAM(默认启用),可能需要禁用 PAM 的密码认证部分
# 注意:完全禁用 UsePAM 可能会影响其他认证方式(如 Kerberos),请根据实际需求决定
UsePAM no

补充说明:

  • PasswordAuthentication no​ 直接禁止了密码登录。

  • ChallengeResponseAuthentication no​ 可以防止某些配置下仍允许通过键盘交互式(如密码)认证。

  • UsePAM no​ 会绕过 PAM 模块,如果您的系统没有其他特殊认证需求(如 LDAP),可以设置此项。如果保留 UsePAM yes​,则仍需确保 PAM 配置(如 /etc/pam.d/sshd​)不会允许密码登录。通常设置前两项已足够。


3. 检查并调整其他相关选项

  • ​PermitRootLogin​:如果您希望禁止 root 直接密码登录,可以设为 prohibit-password​(或 without-password​),仅允许 root 使用密钥登录。

    PermitRootLogin prohibit-password
    

    如果希望完全禁止 root 登录,可设为 no​。

  • AuthenticationMethods​(可选):如果想强制指定认证方法,可以添加:

    AuthenticationMethods publickey
    

4. 保存文件并重启 SSH 服务

sudo systemctl restart sshd

对于较旧的系统(使用 SysVinit):

sudo service ssh restart

5. 验证配置

在另一个终端窗口中尝试使用密码登录(应当被拒绝),然后使用密钥登录验证是否正常:

# 测试密码登录(应提示 Permission denied)
ssh -o PreferredAuthentications=password user@server

# 测试密钥登录(应成功)
ssh user@server

如果密钥登录失败,请检查:

  • 本地私钥路径和权限是否正确~/.ssh/id_rsa​ 权限应为 600)。

  • 服务器上 ~/.ssh/authorized_keys​ 文件是否存在且权限正确(600​),.ssh​ 目录权限为 700​。

  • SSH 服务日志sudo journalctl -u sshd​ 或 sudo tail -f /var/log/auth.log​ 查看详细错误。


补充:使用 sshd 配置测试

在重启服务前,可以使用 sshd -t​ 测试配置文件语法是否正确:

sudo sshd -t

若无输出,说明语法正确。


五、总结

完成以上步骤后,您的 SSH 服务器将只接受密钥认证,密码登录被彻底禁用。这种方式可以显著提高服务器安全性,避免暴力破解密码的风险。

Author: Max

Permalink: /archives/linux-ssh-rsa

Published: 2026-03-21 21:26:02

Updated: 2026-03-21 21:24:49

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG