要通过 SSH config 实现每个主机密钥分离(即不同远程主机使用不同的 SSH 密钥对),核心是在 ssh_config 文件中为每个主机单独指定对应的私钥路径,并强制 SSH 仅使用该密钥。以下是详细的配置步骤和注意事项:

一、核心原理

SSH 默认会尝试所有可用的密钥(如 ~/.ssh/id_rsa~/.ssh/id_ed25519 等),但通过 ssh_config 可以为每个主机绑定专属密钥,并通过 IdentitiesOnly yes 强制 SSH 仅使用指定的密钥,避免密钥混用。

二、准备工作:生成独立密钥对

首先为每个需要分离密钥的主机生成独立的密钥对(如果尚未生成)。推荐使用更安全的 ed25519 算法,命令格式如下:

# 格式:ssh-keygen -t 算法 -f 私钥路径 -C "备注(如主机名)"
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_github -C "github-account"  # 为 GitHub 生成密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps -C "my-vps"  # 为 VPS 生成密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -C "company-server"  # 为工作服务器生成密钥
  • 生成后,私钥路径为 ~/.ssh/id_ed25519_xxx,公钥为 ~/.ssh/id_ed25519_xxx.pub
  • 需将公钥上传到对应远程主机的 ~/.ssh/authorized_keys 中(确保远程主机已启用密钥登录)。

三、配置 SSH config 文件

通过 ~/.ssh/config(Linux/macOS)或 C:\Users\<用户名>\.ssh\config(Windows)文件管理主机配置,每个主机用 Host 块单独定义。

1. 创建/编辑 config 文件

# Linux/macOS 编辑命令
vim ~/.ssh/config

# Windows 可直接在资源管理器中打开对应路径编辑

2. 配置示例(核心参数)

为每个主机添加独立配置,关键参数说明:

  • Host:自定义主机别名(连接时使用,如 ssh github)。
  • HostName:远程主机实际地址(域名/IP)。
  • User:登录远程主机的用户名。
  • IdentityFile:绑定的私钥路径(必须指向步骤二中生成的私钥)。
  • IdentitiesOnly yes:强制 SSH 仅使用 IdentityFile 指定的密钥,不尝试其他密钥。

示例配置:

# 配置 1:GitHub(使用专属密钥)
Host github
  HostName github.com  # 实际地址
  User git  # GitHub 固定登录用户为 git
  IdentityFile ~/.ssh/id_ed25519_github  # 绑定的私钥
  IdentitiesOnly yes  # 强制仅用此密钥
  Port 22  # 可选,默认 22 可省略

# 配置 2:个人 VPS(使用另一密钥)
Host myvps
  HostName 1.2.3.4  # VPS 实际 IP
  User admin  # VPS 登录用户名
  IdentityFile ~/.ssh/id_ed25519_vps  # 另一私钥
  IdentitiesOnly yes
  Port 2222  # 若远程端口非 22,需指定

# 配置 3:公司服务器(再用另一密钥)
Host company-server
  HostName server.company.com  # 公司服务器域名
  User john  # 公司登录用户名
  IdentityFile ~/.ssh/id_ed25519_work  # 公司专属私钥
  IdentitiesOnly yes

四、设置文件权限(关键!)

SSH 对配置文件和密钥的权限要求严格,权限过松会导致配置失效或安全警告,需执行以下命令:

# Linux/macOS 权限设置
chmod 600 ~/.ssh/config  # config 文件仅所有者可读写
chmod 600 ~/.ssh/id_ed25519_*  # 所有私钥文件仅所有者可读写
chmod 700 ~/.ssh  # .ssh 目录仅所有者可访问

# Windows 需在文件属性中关闭“只读”,并确保“安全”设置中仅当前用户有读写权限(无其他用户权限)

五、测试配置是否生效

通过自定义别名连接远程主机,验证是否使用了指定密钥:

# 连接 GitHub 测试
ssh github

# 连接 VPS 测试
ssh myvps

# 连接公司服务器测试
ssh company-server

若需确认使用的密钥,可通过 -v 查看调试日志:

ssh -v github  # 日志中会显示 "Offering public key: ...",确认路径是否正确

六、常见问题排查

  1. 连接失败/仍需密码

    • 检查 IdentityFile 路径是否正确(私钥是否存在)。
    • 确认远程主机 ~/.ssh/authorized_keys 已添加对应公钥,且权限为 600
    • 确保 IdentitiesOnly yes 已添加(否则可能仍尝试其他密钥)。
  2. 权限错误警告

    • 重新执行步骤四中的权限设置命令,确保 ~/.ssh/config 和私钥权限为 600
  3. 别名不生效

    • 检查 Host 别名是否拼写正确,连接时直接使用别名(如 ssh github 而非 ssh github.com)。

通过以上配置,每个主机将严格使用专属密钥,实现密钥分离,提升安全性(即使某一密钥泄露,其他主机不受影响)。