惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - I'mAlex

Linux 环境下数据库服务开机自启实战:root.sh 脚本配置与服务管理全解 踩坑实录:NFS挂载环境下脚本执行权限问题(Operation not permitted)的深度排查与解决 单机数据库小版本升级实战:零数据迁移、分钟级完成的高效方案 表空间目录自动创建:告别手工建目录,提升数据库运维效率 深度解析:数据库 OID 与 ROWID 原理、用法与实战避坑 配置数据库日志输出到syslog,运维再也不用挨个找日志了 一文读懂数据库data目录:原来你的数据都藏在这里 告别Oracle:深度解析数据库迁移的真实成本、技术路径与落地实战 Oracle替换实战干货:别再被迁移坑了,零改造+低成本落地全攻略 OpenClaw+优云智算Coding Plan:从灵感到成文,再到公众号发布的全流程AI自动化 MySQL迁移不再踩坑:金仓数据库兼容性与工程实力深度解析 信创替代破局:金仓数据库MySQL兼容性与迁移工程实力深度解析 融合为体,一库多能:金仓数据库重构企业数智化数据底座 KingbaseES 用户、会话与连接控制:从权限到连接池的实战运维 KingbaseES PLSQL异常处理深度解析:机制、实践与优化 国产化时序数据库替换实战:金仓全方位替代InfluxDB/TimescaleDB/TDengine指南 文档数据库国产化替代实践:金仓KES打造MongoDB高兼容迁移方案 关系数据库替换用金仓:数据迁移中的完整性与一致性风险深度解析 Oracle平滑迁移到KingbaseES关系数据库的技术实践 金仓数据库赋能北京一卡通:国产数据库在民生核心系统的信创实践标杆 深度解析数据库TOAST技术:超大字段存储的核心实现与实操指南 AI Ping实测:一站式大模型API评测+调用,开发者选型对接效率翻倍 KingbaseES数据库瓶颈排查实战指南:从实例到语句的全维度解析 金仓数据库平替MongoDB实操解析:多模融合赋能企业文档数据管理国产化升级
SSH Key多密钥管理实战:不同域名/不同仓库/不同目录自动匹配...
I'mAlex · 2026-01-28 · via 博客园 - I'mAlex

一、多SSH Key密钥的使用背景

日常工作有时候需要区分使用不同的SSH Key,最核心的应用场景主要有三类:按域名维度区分(不同域名对应不同密钥)、按仓库维度区分(不同仓库对应不同密钥)、按目录维度区分(通过全局Git配置,不同目录自动使用不同密钥)。本文聚焦这三大场景,通过标准化实操步骤,实现多SSH Key的精准区分与高效使用,解决密钥混用引发的连接失败、权限异常等核心问题。

二、场景一:按域名维度区分(最常用,不同域名使用不同ssh key)

核心逻辑:通过配置SSH客户端的config配置文件,建立“域名-密钥”的对应关联,指定访问特定域名时自动调用对应的SSH密钥。该场景适用于个人GitHub(github.com)、企业GitLab(git.company.com)等多域名并行使用的场景,一次配置即可实现全局自动匹配,无需手动指定密钥,提升开发效率。

2.1 生成域名专属可区分密钥

为每个目标域名生成独立SSH密钥,建议在密钥命名时包含域名标识,避免混用混淆。以下以“个人Git(如github.com)”和“企业Git(如git.company.com)”为例,提供标准化生成命令,兼顾安全性与兼容性:

# 生成github.com专用密钥(采用ed25519算法,安全性更高、密钥体积更小,推荐优先使用)
ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_github

# 生成git.company.com专用密钥(采用rsa算法,4096位加密,适配兼容性要求较高的企业环境)
ssh-keygen -t rsa -b 4096 -C "work@company.com" -f ~/.ssh/id_rsa_company

密钥生成完成后,进入~/.ssh目录(命令:cd ~/.ssh)可查看对应文件,每套密钥均包含私钥(无.pub后缀)和公钥(.pub后缀)。

其中,私钥为核心保密凭证,严禁泄露;公钥用于后续目标平台的身份认证部署。

2.2 配置~/.ssh/config文件

SSH客户端的配置文件:~/.ssh/config用于管理“主机-密钥”映射关系,通过该配置可实现域名与密钥的自动匹配,具体操作步骤如下:

  1. 创建并编辑config文件:若~/.ssh目录下无config文件,执行以下命令创建并编辑(可替换vim为nano等常用编辑器):vim ~/.ssh/config
  2. 在config文件中添加以下配置,根据实际域名和密钥路径替换对应内容,每个域名对应一个独立Host块,确保配置语法规范:
Host github.com
  HostName github.com
  User git                               # Git平台固定登录用户,无需修改
  IdentityFile ~/.ssh/id_ed25519_github  # 绑定当前域名对应的私钥路径
  IdentitiesOnly yes   # 强制使用当前配置指定的密钥,避免优先调用默认密钥导致冲突

Host git.company.com
  HostName git.company.com  # 企业Git托管网站实际域名,替换为自身环境地址
  User git                  # 企业Git托管网站实际用户名,替换为自己的用户名
  IdentityFile ~/.ssh/id_rsa_company  # 绑定企业域名对应的私钥路径
  IdentitiesOnly yes   # 强制使用当前配置指定的密钥,避免优先调用默认密钥导致冲突
  1. 配置文件权限设置:SSH协议对config文件和密钥文件的权限要求严格,权限过高会导致连接失败,需执行以下命令设置标准权限:
# 设置.ssh目录权限,仅当前用户可读写执行,避免其他用户访问
chmod 700 ~/.ssh

# 设置config文件权限,仅当前用户可读写,防止配置被篡改
chmod 600 ~/.ssh/config

# 设置所有私钥文件权限,仅当前用户可读写,保障私钥安全
chmod 600 ~/.ssh/*

2.3 公钥部署

配置完成后,需将对应域名的公钥部署至目标平台,并测试连接有效性,确保密钥匹配正常。首先,需要将对应域名的公钥内容上传至Git托管平台。

以github.com为例,执行命令cat ~/.ssh/id_ed25519_github.pub,复制输出的完整公钥内容(包含开头算法标识和结尾注释)。

登录GitHub,进入「Settings」→「SSH and GPG keys」→「New SSH key」,如上图所示,粘贴公钥,输入Title,点击Add SSH Key按钮,添加即可。

参考同样的方法,再把~/.ssh/id_rsa_company.pub配置到企业Git平台。

2.4 连接验证

连接测试:执行以下命令测试密钥匹配是否生效,若输出平台欢迎信息,则说明配置成功,SSH会自动调用对应域名的密钥:

# 测试github.com连接有效性
ssh -T git@github.com

如上图所示,是连接测试成功的打印,可以看到github的用户名。

三、场景二:按仓库维度区分(不同仓库用不同key)

核心逻辑:当不同仓库需使用不同SSH密钥(如个人仓库、开源协作仓库、企业内部仓库)时,无需修改全局config文件,可通过Git仓库本地配置,为单个仓库指定专属SSH密钥,配置仅对当前仓库生效,不影响其他仓库使用。

举个例子:github.com域名下,个人仓库使用密钥A、参与的开源仓库使用密钥B。

3.1 生成仓库专属独立密钥

为每个需要区分的仓库生成独立SSH密钥,密钥命名需包含仓库标识,便于后续管理和区分,以github.com域名下两个不同仓库为例,生成命令如下:

# 仓库1(个人私有仓库:my-project)专用密钥
ssh-keygen -t ed25519 -C "my-project@email.com" -f ~/.ssh/id_ed25519_myproject

# 仓库2(开源协作仓库:open-source)专用密钥
ssh-keygen -t ed25519 -C "open-source@email.com" -f ~/.ssh/id_ed25519_opensource

3.2 为单个仓库配置专属密钥(核心操作)

通过Git本地配置命令,为单个仓库绑定专属SSH密钥,操作步骤简洁,且仅对当前仓库生效,具体如下:

  1. 进入本地仓库目录:切换至需要配置专属密钥的本地仓库根目录,以my-project仓库为例,执行命令:cd ~/projects/my-project
  2. 执行Git本地配置命令,指定当前仓库使用的SSH密钥,命令如下:
# 示例:为my-project仓库配置专属密钥
cd ~/projects/my-project
git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_myproject -F /dev/null"

参数说明:-F /dev/null用于忽略全局config文件的密钥配置,强制当前仓库使用指定的专属密钥,避免配置冲突。

  1. 其他仓库配置:对于open-source等其他需要区分的仓库,重复步骤1-2,替换对应仓库目录和密钥路径即可,示例命令:
# 示例:为open-source仓库配置专属密钥
cd ~/projects/open-source
git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_opensource -F /dev/null"

3.3 公钥部署与配置验证

  1. 公钥部署:将每个仓库对应的公钥(.pub后缀文件),上传至该仓库所在平台的对应账号中。需注意,公钥需与仓库归属账号绑定,确保账号拥有该仓库的访问权限,避免权限异常。
  2. 配置验证:通过仓库的拉取(pull)或推送(push)操作,测试密钥配置是否生效,示例命令如下:
# 进入my-project仓库,测试密钥匹配有效性
cd ~/projects/my-project
git pull  # 正常拉取无权限错误,说明已使用id_ed25519_myproject密钥

# 进入open-source仓库,测试密钥匹配有效性
cd ~/projects/open-source
git pull  # 正常拉取无权限错误,说明已使用id_ed25519_opensource密钥

若执行命令无Permission denied (publickey)错误,且能正常拉取仓库内容,即说明仓库专属密钥配置成功。

四、场景三:按目录维度区分(全局Git配置,不同目录自动使用不同ssh key)

核心逻辑:利用Git的includeIf全局配置指令,根据本地仓库所在目录进行匹配,自动加载对应目录的专属Git配置文件(含SSH密钥配置)。该场景适用于目录划分清晰的场景(如个人项目目录:/personal、企业项目目录:/work),无需为每个仓库单独配置,只需按目录设置一次,该目录下所有仓库均自动使用对应密钥,大幅提升配置效率。

适用场景:个人项目与企业项目目录分离,两类项目使用不同SSH密钥;多个客户项目按目录分类,不同目录对应不同客户的密钥,实现批量管控。

4.1 生成目录专属独立密钥

按目录用途生成独立SSH密钥,密钥命名包含目录标识,便于关联管理。以下以“个人项目目录:/personal、企业项目目录:/work”为例,生成对应专属密钥:

# 个人项目目录(~/personal)专用密钥
ssh-keygen -t ed25519 -C "personal-dir@email.com" -f ~/.ssh/id_ed25519_personal

# 企业项目目录(~/work)专用密钥
ssh-keygen -t rsa -b 4096 -C "work-dir@company.com" -f ~/.ssh/id_rsa_work

密钥生成后,同样需妥善保管私钥,将对应公钥上传至目标平台(个人项目公钥传GitHub、企业项目公钥传企业Git平台)

4.2 公钥部署

参考场景一1.3节公钥部署步骤。

以github.com为例,执行命令cat ~/.ssh/id_ed25519_personal.pub,复制输出的完整公钥内容(包含开头算法标识和结尾注释)。

登录GitHub,进入「Settings」→「SSH and GPG keys」→「New SSH key」,如上图所示,粘贴公钥,输入Title,点击Add SSH Key按钮,添加即可。

参考同样的方法,将~/.ssh/id_rsa_work.pub配置到企业Git平台。

4.2 定制git全局配置文件

核心是创建两个目录专属的Git配置文件,再通过全局Git配置的includeIf指令,实现“目录匹配-配置加载”的自动关联,具体步骤如下:

4.2.1 创建个人项目目录专属git配置文件:~/.gitconfig-personal

创建个人目录专属的git配置文件(~/.gitconfig-personal): vim ~/.gitconfig-personal,粘贴以下内容,指定个人目录使用的SSH密钥:

[core]
  sshCommand = ssh -i ~/.ssh/id_ed25519_personal -F /dev/null

说明:-F /dev/null 用于忽略全局SSH config配置,确保目录专属密钥优先生效。

4.2.2 创建企业项目目录专属git配置文件:~/.gitconfig-work

创建企业目录目录专属的git配置文件(~/.gitconfig-work):vim ~/.gitconfig-work,粘贴以下内容,指定企业目录使用的SSH密钥:

[core]
  sshCommand = ssh -i ~/.ssh/id_rsa_work -F /dev/null

说明:-F /dev/null 作用同前,用于忽略全局SSH config配置,确保目录专属密钥优先生效。

4.2.3 创建Git全局配置文件:~/.gitconfig

创建Git配置文件(~/.gitconfig),添加includeIf指令:vim ~/.gitconfig,粘贴以下内容,通过includeIf自动匹配目录,自动加载对应配置文件:

# 匹配个人项目目录:~/personal下所有仓库,加载gitconfig-personal配置
[includeIf "gitdir:~/personal/"]
  path = ~/.gitconfig-personal

# 匹配企业项目目录:~/work下所有仓库,加载gitconfig-work配置
[includeIf "gitdir:~/work/"]
  path = ~/.gitconfig-work

关键说明:

  1. gitdir:~/personal/ 末尾的/不可省略,用于匹配该目录下所有子目录(含嵌套仓库)。
  2. path指定对应目录配置文件的绝对路径,确保Git能正确加载。

4.3 配置验证

通过在不同目录下克隆仓库或执行Git操作,验证密钥是否自动匹配,步骤如下:

4.3.1 个人目录git配置验证

# 进入个人项目目录
cd ~/personal

# 克隆个人GitHub仓库(无需手动指定密钥)
git clone git@github.com:your-username/your-personal-repo.git

进入克隆后的仓库,通过命令git config core.sshCommand查看当前仓库的SSH密钥配置。

如上图所示,输出结果为ssh -i ~/.ssh/id_ed25519_personal -F /dev/null,说明个人目录已自动加载对应密钥。

4.3.2 企业目录git配置验证

# 进入企业项目目录
cd ~/work

# 克隆企业GitLab仓库
git clone git@git.company.com:company-team/company-repo.git

进入克隆后的仓库,通过命令git config core.sshCommand查看当前仓库的SSH密钥配置,输出结果应为ssh -i ~/.ssh/id_rsa_work -F /dev/null,说明企业目录也已自动加载对应密钥,配置生效。

目录匹配规则验证成功后,后续在对应目录下操作任何Git仓库,都会自动使用该目录绑定的SSH密钥,无需额外配置。

五、避坑指南

  • 私钥安全管控:有私钥(无.pub后缀的文件)属于核心保密凭证,严禁泄露、上传至公共代码仓库或通过非加密渠道(如普通邮件、微信)传输,仅公钥可用于目标平台的身份认证部署。
  • 有私钥(无.pub后缀的文件)属于核心保密凭证,严禁泄露、上传至公共代码仓库或通过非加密渠道(如普通邮件、微信)传输,仅公钥可用于目标平台的身份认证部署。
  • 权限异常排查:若执行SSH连接或Git操作时提示Permission denied (publickey),优先排查文件权限配置,可参考场景一1.2步骤中的权限设置命令重新配置,确保.ssh目录、config文件及私钥的权限符合SSH协议要求。
  • 配置优先级说明:仓库维度的本地配置(git config core.sshCommand)> 目录维度的全局Git配置(includeIf)> 域名维度的SSH config配置,可根据实际需求灵活选择配置方式。
  • 配置语法规范:① SSH config文件中每个Host块的配置项需缩进(建议2个空格),关键字无拼写错误;② Git includeIf指令中,gitdir路径末尾需加/,否则无法匹配子目录;③ 目录专属配置文件的路径需填写绝对路径,避免Git加载失败。
  • 目录匹配补充:若需匹配自定义目录(如~/client1~/client2),只需重复includeIf配置,替换目录路径和对应配置文件即可,扩展性极强。

六、总结

多个SSH Key的区分使用,核心是通过“全局配置”“本地配置”“目录配置”三种方式,实现密钥与域名、仓库、目录的精准绑定,三大场景的核心操作可总结如下:

  1. 不同域名场景:通过配置~/.ssh/config文件,建立“域名-密钥”的全局映射,实现多域名密钥的自动匹配,一次配置终身可用,适配多平台并行使用需求。
  2. 同一域名不同仓库场景:进入目标仓库目录,通过git config core.sshCommand命令指定仓库专属密钥,配置仅对当前仓库生效,灵活解决同一域名下多仓库密钥区分需求。
  3. 不同目录场景:通过Git全局配置的includeIf指令,绑定“目录-专属配置文件”,实现该目录下所有仓库自动使用对应密钥,适合目录划分清晰的批量管控场景,提升配置效率。

无需复杂的额外配置,掌握上述三大场景的核心操作,即可高效、安全地实现多个SSH Key的区分使用,彻底解决密钥混用导致的连接失败、权限异常等问题,适配不同开发者的实操需求,提升开发实操效率。