要通过 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: ...",确认路径是否正确
六、常见问题排查
-
连接失败/仍需密码:
- 检查
IdentityFile
路径是否正确(私钥是否存在)。 - 确认远程主机
~/.ssh/authorized_keys
已添加对应公钥,且权限为600
。 - 确保
IdentitiesOnly yes
已添加(否则可能仍尝试其他密钥)。
- 检查
-
权限错误警告:
- 重新执行步骤四中的权限设置命令,确保
~/.ssh/config
和私钥权限为600
。
- 重新执行步骤四中的权限设置命令,确保
-
别名不生效:
- 检查
Host
别名是否拼写正确,连接时直接使用别名(如ssh github
而非ssh github.com
)。
- 检查
通过以上配置,每个主机将严格使用专属密钥,实现密钥分离,提升安全性(即使某一密钥泄露,其他主机不受影响)。