一、通用准备(必做)

  1. 配置文件路径:主配置 /etc/ssh/sshd_config + 子配置 /etc/ssh/sshd_config.d/*.conf(确保子配置不冲突,建议删除子配置中与认证相关的行,或与主配置保持一致)。

  2. 权限检查:服务器用户的 ~/.ssh 目录权限 700authorized_keys 权限 600(避免密钥认证失败):

    bash

    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    

  3. 重启生效命令:修改后必执行

    bash

    sudo sshd -t  # 检查语法
    sudo systemctl restart ssh  # 重启服务
    

二、分场景配置(选一种即可)

场景 1:仅密钥认证(最安全,推荐长期用)

核心配置(添加到 sshd_config 末尾):


conf

PubkeyAuthentication yes        # 启用密钥认证
PasswordAuthentication no       # 禁用密码认证
# 无需其他配置,默认仅接受密钥


效果:只能通过客户端私钥登录,密码无效。

场景 2:仅密码认证(不推荐,仅临时应急)

核心配置


conf

PubkeyAuthentication no         # 禁用密钥认证
PasswordAuthentication yes      # 启用密码认证
PermitEmptyPasswords no         # 禁止空密码


效果:只能通过用户密码登录,密钥无效(安全性低,易被暴力破解)。

场景 3:密钥 + 密码双重认证(高安全,需 OpenSSH ≥6.2)

核心配置


conf

PubkeyAuthentication yes        # 启用密钥
PasswordAuthentication yes      # 启用密码
AuthenticationMethods publickey,password  # 强制两者都通过


效果:必须先通过密钥验证,再输入密码,缺一不可(双重保障)。

场景 4:密钥或密码任选(兼容需求)

核心配置


conf

PubkeyAuthentication yes        # 启用密钥
PasswordAuthentication yes      # 启用密码
# 不设置 AuthenticationMethods,默认允许任选一种


效果:用户可选择用密钥直接登录,或用密码登录(兼顾安全与兼容)。

三、验证配置是否生效

执行以下命令,查看当前实际生效的认证方式:


bash

sudo sshd -T | grep -E "pubkey|password|authenticationmethods"


  • 例如场景 3 的预期输出:
    pubkeyauthentication yes + passwordauthentication yes + authenticationmethods publickey,password

四、关键注意事项

  1. 子配置冲突:若 grep -r "PasswordAuthentication" /etc/ssh/sshd_config.d/ 有输出,需删除子配置中的认证相关行(或与主配置保持一致),避免被覆盖。

  2. 版本兼容:双重认证(场景 3)需 OpenSSH ≥6.2,检查版本:ssh -V,低于 6.2 则不支持 AuthenticationMethods

  3. 日志排查:登录失败时查看日志:sudo tail -f /var/log/auth.log(常见错误:权限问题、密钥不匹配、配置语法错误)。

举例,3 个设备上生成独立私钥并同步到服务器的完整方案,核心通过多设备密钥对生成 + 服务器公钥聚合实现:

一、核心原理与流程

  1. 密钥对生成:每个设备独立生成自己的私钥+公钥对(互不干扰)。

  2. 公钥聚合:将 3 个设备的公钥全部追加到服务器的~/.ssh/authorized_keys文件中。

  3. 认证机制:服务器验证客户端提供的私钥是否匹配文件中的任一公钥,匹配则允许登录。

二、分步操作指南(以 3 个设备为例)

步骤 1:在每个设备上生成独立密钥对

设备 1、设备 2、设备 3上分别执行以下命令(生成互不相同的密钥对):


bash

# 设备1:生成RSA密钥对(文件名自定义为device1_rsa)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/device1_rsa -C "device1@example.com"

# 设备2:生成ED25519密钥对(文件名device2_ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/device2_ed25519 -C "device2@example.com"

# 设备3:生成ECDSA密钥对(文件名device3_ecdsa)
ssh-keygen -t ecdsa -b 521 -f ~/.ssh/device3_ecdsa -C "device3@example.com"


关键参数说明


  • -t:指定密钥类型(RSA 兼容性好,ED25519 安全高效)。

  • -f:自定义密钥文件名(避免覆盖默认的id_rsa)。

  • -C:注释(标识设备用途,如device1@example.com)。


生成后文件
每个设备会生成 2 个文件,例如设备 1 生成:


plaintext

~/.ssh/device1_rsa       # 私钥(需妥善保管,不可泄露)
~/.ssh/device1_rsa.pub   # 公钥(需上传到服务器)

步骤 2:将 3 个设备的公钥上传到服务器

方法 1:使用ssh-copy-id自动上传(推荐)
在设备 1 上执行:


bash

ssh-copy-id -i ~/.ssh/device1_rsa.pub shitou@服务器IP


设备 2 和设备 3 重复此命令,替换为各自的公钥路径。


方法 2:手动上传(适用于无ssh-copy-id的环境)


  1. 在设备 1 上复制公钥内容:

    bash

    cat ~/.ssh/device1_rsa.pub
    


    复制输出的完整字符串(以ssh-rsassh-ed25519开头)。

  2. 登录服务器,将公钥追加到authorized_keys

    bash

    ssh shitou@服务器IP
    echo "设备1的公钥内容" >> ~/.ssh/authorized_keys
    


    重复此步骤,将设备 2 和设备 3 的公钥依次追加到同一文件。


权限检查(必做)


bash

chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys  # 确保权限正确

步骤 3:验证 3 个设备均能登录

设备 1 登录


bash

ssh -i ~/.ssh/device1_rsa shitou@服务器IP  # 使用设备1的私钥


设备 2 登录


bash

ssh -i ~/.ssh/device2_ed25519 shitou@服务器IP  # 使用设备2的私钥


设备 3 登录


bash

ssh -i ~/.ssh/device3_ecdsa shitou@服务器IP  # 使用设备3的私钥


若无需输入密码直接登录,说明配置成功。

三、关键技术细节

1. 服务器端authorized_keys文件结构

文件中每行存储一个公钥,示例:


conf

# 设备1的RSA公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDG... device1@example.com

# 设备2的ED25519公钥
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINYQ... device2@example.com

# 设备3的ECDSA公钥
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFB... device3@example.com

2. 客户端免输入私钥路径的技巧

在客户端设备的~/.ssh/config文件中添加配置,简化登录命令:


conf

# 设备1的配置
Host server-device1
    HostName 服务器IP
    User shitou
    IdentityFile ~/.ssh/device1_rsa

# 设备2的配置
Host server-device2
    HostName 服务器IP
    User shitou
    IdentityFile ~/.ssh/device2_ed25519

# 设备3的配置
Host server-device3
    HostName 服务器IP
    User shitou
    IdentityFile ~/.ssh/device3_ecdsa


登录时只需执行:


bash

ssh server-device1  # 自动使用设备1的私钥
ssh server-device2  # 自动使用设备2的私钥

3. 安全性增强建议

  • 私钥加密:生成密钥时设置密码短语(ssh-keygen提示输入时设置),防止私钥泄露后被滥用。

  • 定期轮换密钥:每 3-6 个月生成新密钥对,替换旧公钥。

  • 限制公钥用途:在服务器的authorized_keys中添加前缀限制,例如仅允许特定 IP 或命令:

    conf

    from="192.168.31.100",command="/usr/bin/backup.sh" ssh-rsa ...
    

四、常见问题排查

1. 登录失败:Permission denied (publickey)

  • 检查步骤

    1. 确认私钥文件路径和名称正确(如-i ~/.ssh/device1_rsa)。

    2. 检查服务器authorized_keys中是否存在对应的公钥。

    3. 确保服务器~/.ssh目录权限为700authorized_keys权限为600

2. 公钥重复导致覆盖

  • 解决方案:使用>>追加而非>覆盖(如echo "公钥" >> authorized_keys)。

3. 设备间私钥混淆

  • 预防措施:为每个设备的私钥文件添加唯一前缀(如device1_rsadevice2_ed25519),并在~/.ssh/config中明确绑定。

五、扩展场景:结合双重认证(密钥 + 密码)

若需进一步增强安全性,可配置双重认证(需 OpenSSH ≥6.2):


  1. 修改服务器sshd_config

    conf

    PubkeyAuthentication yes
    PasswordAuthentication yes
    AuthenticationMethods publickey,password  # 强制两者都通过
    

  2. 重启 SSH 服务:

    bash

    sudo systemctl restart ssh