SSH Key 是通过非对称加密实现免密登录和身份验证的方式,比密码更安全,也更方便。本文覆盖日常开发中最常见的几种情况。
算法选择
生成 SSH Key 之前,先确定用哪种算法。
| 算法 | 推荐程度 | 说明 |
|---|---|---|
| Ed25519 | ✅ 首选 | 现代椭圆曲线算法,密钥短、速度快、安全性强 |
| RSA 4096 | ✅ 兼容用 | 兼容性最好,老系统必备,密钥较长 |
| ECDSA | ⚠️ 可用 | 比 RSA 短,但某些实现有隐患 |
| RSA 2048 | ❌ 不推荐 | 已被认为强度不足 |
| DSA | ❌ 不推荐 | 已废弃 |
结论:新环境优先用 Ed25519,需要兼容老系统时用 RSA 4096。
基础:生成第一个 SSH Key
Ed25519(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
RSA 4096(兼容用)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
执行后会提示:
Enter file in which to save the key (/Users/you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
- 文件路径:直接回车用默认路径即可
- Passphrase:建议设置,相当于给私钥加一层密码保护
生成成功后:
~/.ssh/id_ed25519— 私钥,不要泄露、不要上传~/.ssh/id_ed25519.pub— 公钥,粘贴到各平台
查看公钥内容
cat ~/.ssh/id_ed25519.pub
输出类似:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com
把这一整行复制,粘贴到 GitHub / GitLab / 服务器的 authorized_keys 即可。
情况一:多平台多账号(最常见)
工作中很常见同时用 GitHub 个人账号、GitHub 公司账号、GitLab、内网服务器,每个都需要独立密钥。
第一步:生成多个密钥,分别命名
# 个人 GitHub
ssh-keygen -t ed25519 -C "me@personal.com" -f ~/.ssh/id_ed25519_github_personal
# 公司 GitHub
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_github_work
# GitLab
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_gitlab
# 内网服务器
ssh-keygen -t ed25519 -C "server" -f ~/.ssh/id_ed25519_server
第二步:配置 ~/.ssh/config
# 个人 GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_personal
# 公司 GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_work
# GitLab
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_gitlab
# 内网服务器
Host dev-server
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519_server
第三步:使用别名操作
# clone 个人仓库(用 Host 别名替换 github.com)
git clone git@github-personal:username/repo.git
# clone 公司仓库
git clone git@github-work:company/repo.git
# 直接 SSH 登录服务器
ssh dev-server
情况二:添加到 ssh-agent
如果私钥设置了 passphrase,每次使用都要输密码。ssh-agent 可以在会话期间记住密码。
# 启动 agent(通常已自动启动)
eval "$(ssh-agent -s)"
# 将私钥添加到 agent
ssh-add ~/.ssh/id_ed25519
# 查看已加载的 key
ssh-add -l
macOS 持久化(将 key 保存到 Keychain,重启后不用重新 add):
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
在 ~/.ssh/config 中加上这两行,让 macOS 自动使用 Keychain:
Host *
AddKeysToAgent yes
UseKeychain yes
情况三:将公钥部署到服务器
方式一:ssh-copy-id(最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
方式二:手动追加
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
方式三:直接编辑服务器文件
登录服务器后:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
权限很重要,设错了 SSH 会拒绝:
| 路径 | 权限 |
|---|---|
~/.ssh/ | 700 |
~/.ssh/authorized_keys | 600 |
| 私钥文件 | 600 |
| 公钥文件 | 644 |
情况四:Windows 环境
Windows 有几种情况需要单独处理。
Git Bash / WSL
流程和 macOS/Linux 基本一致,~/.ssh/ 路径同样有效。
PowerShell(OpenSSH 内置)
Windows 10 1809+ 已内置 OpenSSH:
# 生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 密钥默认存放在
# C:\Users\你的用户名\.ssh\id_ed25519
启动 ssh-agent 服务
# 以管理员身份运行
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
# 添加密钥
ssh-add $env:USERPROFILE\.ssh\id_ed25519
情况五:测试连接
配置完成后验证是否生效:
# 测试 GitHub
ssh -T git@github.com
# 输出:Hi username! You've successfully authenticated...
# 测试使用别名
ssh -T git@github-personal
# 测试服务器(-v 显示详细日志,排查问题用)
ssh -v user@server_ip
情况六:更换或吊销密钥
生成新密钥后,需要:
- 把新公钥添加到所有平台 / 服务器
- 从平台 / 服务器删除旧公钥
- 本地删除旧私钥文件(可选)
# 从 agent 移除旧 key
ssh-add -d ~/.ssh/old_key
# 删除旧密钥文件
rm ~/.ssh/old_key ~/.ssh/old_key.pub
服务器上删除旧公钥:
# 编辑 authorized_keys,删掉对应那一行即可
nano ~/.ssh/authorized_keys
常见问题
Permission denied (publickey)
- 检查公钥是否已添加到目标平台
- 检查
~/.ssh/authorized_keys权限是否为 600 - 用
ssh -v查看详细握手日志
每次都要输 passphrase
- 把 key 加入 ssh-agent:
ssh-add ~/.ssh/id_ed25519 - macOS 用
--apple-use-keychain持久化
Git clone 用的是哪个 key
# 查看当前用的是哪个身份
ssh -T git@github.com
# 指定 key 临时测试
ssh -i ~/.ssh/id_ed25519_github_personal -T git@github.com
Fonnpo