在开发者的日常工作中,我们经常面临一个选择:个人的 GitHub 和公司的 GitLab,到底是用同一把 SSH Key,还是分开生成?
这是一个典型的 "便利性 vs 安全性" 的博弈。本文将从安全原理出发,分析共用 Key 的隐患,并提供一套只需配置一次的"优雅分治"方案。
⚠️ 核心结论
技术上:完全可行
SSH 协议只验证公私钥匹配,并不关心这把钥匙还开了哪扇门。你可以一把钥匙通吃所有 Git 平台,代码提交没有任何障碍。
安全上:极度危险(不推荐)
共用 SSH Key 违反了安全领域的"最小权限原则"和"故障隔离原则"。
🛑 为什么不建议共用?(三大隐患)
虽然共用能省去几分钟的配置时间,但它留下的隐患如同在家里和公司保险柜上装了同一把锁。
1. 爆炸半径失控(Security Blast Radius)
这是最致命的风险。如果你的个人电脑中毒、私钥被窃,或者你不小心将私钥误传到云端:
- 后果: 黑客不仅攻破了你的个人 GitHub,还能顺藤摸瓜直接利用该 Key 访问公司的内部代码库。
- 影响: 原本只是个人账号泄漏,瞬间升级为严重的公司安全事故。
2. 离职交接的泥潭
当你离开公司时,理论上必须作废所有用于公司权限的凭证。
- 如果你共用 Key: 你不仅要在公司系统删掉公钥,还被迫要在自己的电脑上重新生成新 Key,再去 GitHub 重新上传,并修改本地所有项目的配置。
- 如果你不换: 公司审计日志里若出现这把 Key 的活动记录,会混淆"前员工"与"个人开发者"的身份,带来合规风险。
3. 资产归属权争议
许多公司的《信息安全协议》规定:访问公司资产的凭证必须专用于公司业务。公私混用可能在法律层面违反你签署的入职协议。
🛠 最佳实践:如何优雅地分开配置?
最推荐的做法是:生成两对不同的 Key,通过 config 文件自动路由。
(注:以下教程基于 macOS/Linux 环境,推荐使用更安全短小的 ed25519 算法)
第一步:生成两把不同的钥匙
在生成时,不要一路回车,通过 -f 参数指定不同的文件名。
Bash
# 1. 生成个人用的 Key (GitHub)
ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_github
# 2. 生成公司用的 Key (GitLab)
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_gitlab
建议: 为了安全,生成时建议设置 passphrase(密码)。Mac 用户后续可以通过系统钥匙串实现免密调用。
第二步:配置 SSH 路由(核心步骤)
创建或编辑 ~/.ssh/config 文件,告诉系统:"去 GitHub 用这把锁,去公司用那把锁"。
Bash
vim ~/.ssh/config
在该文件中写入以下内容:
Plaintext
# --- 个人 GitHub 配置 ---
Host github.com
HostName github.com
User git # 注意:这里必须是 git,不能填你的用户名
IdentityFile ~/.ssh/id_ed25519_github
UseKeychain yes # Mac 专用:利用钥匙串记住密码
AddKeysToAgent yes # 自动添加到 agent
# --- 公司 GitLab 配置 ---
# 假设公司 Git 地址是 git.company.com
Host git.company.com
HostName git.company.com
User git # 注意:这里也保持 git
IdentityFile ~/.ssh/id_ed25519_gitlab
UseKeychain yes # Mac 专用
AddKeysToAgent yes
第三步:上传公钥
最后,将以 .pub 结尾的公钥内容分别贴到对应的后台。
- GitHub: 复制
id_ed25519_github.pub-> GitHub Settings -> SSH Keys - GitLab: 复制
id_ed25519_gitlab.pub-> GitLab Settings -> SSH Keys
第四步:测试连接
配置完成后,可以用以下命令测试(注意不要用 git clone,直接用 ssh -T 测试握手):
Bash
# 测试 GitHub
ssh -T git@github.com
# 预期输出:Hi username! You've successfully authenticated...
# 测试公司 GitLab
ssh -T git@git.company.com
# 预期输出:Welcome to GitLab, @workname!
💡 总结
- 如果你只是为了省事: 暂时混用确实代码能跑,但你在拿安全性赌博。
- 如果你想做个专业的开发者: 强烈建议花 5 分钟把它们分开。
公私分明,不仅是保护公司的资产,更是保护你自己职业生涯的最佳方式。