SSH密钥登录配置速查:从单机到多服务器管理的完整指南
结论先行:SSH 密钥登录三步搞定基础安全——生成 ed25519 密钥、上传公钥、禁掉密码登录。进阶用 ~/.ssh/config 管多服务器、SSH Agent 免密 passphrase、不同账号用不同密钥。配不好要么进不去、要么被爆破,这是 VPS 安全的地基,务必先配密钥、测通能登录、再禁密码(顺序反了会把自己锁外面)。
上篇讲了 VPS 初始化,这篇专门深入 SSH 密钥。如果你管着几台 VPS、几个 GitHub 账号,迟早会遇到密钥对不上的情况——这篇把常见场景一次讲清,配好一次,长期受用。
我的 VPS 推荐:我管理 8 台 VPS,分别在 Vultr、DigitalOcean、AWS 上。如果你还没选 VPS,我推荐这几家性价比高的(Vultr · DigitalOcean)。
1、期望目标
上篇文章我们讲了VPS到手后的初始化,其中SSH密钥登录是核心。但实际使用中,你会遇到更复杂的场景:
- ✅ 多服务器管理:手头有3-5台VPS,每台服务器用不同密钥
- ✅ 多账号隔离:GitHub个人账号+公司账号、GitLab多个账号
- ✅ SSH Agent免密:私钥设置了passphrase,不想每次都输入
- ✅ 跨平台使用:Mac日常开发、Windows临时管理、手机应急登录
- ✅ 故障排查:密钥登录失败、权限问题、连接被拒绝
这篇文章的目标是让你在任何SSH场景下都能从容应对。
新手必读路径(30 分钟搞定):
- 生成密钥(3.1)
- 上传公钥(3.2)
- 配置 SSH Config(3.3)
- 配置 SSH Agent(3.4)
进阶按需查阅:
- 多账号管理 → 3.6
- 故障排查 → 第 5 节
- Windows 特殊配置 → 3.4/3.5
2、计划思考
为什么需要单独讲SSH密钥?
上篇文章讲了基础的密钥登录配置,但实际出海开发者的环境更复杂:
| 场景 | 挑战 | 解决方案 |
|---|---|---|
| 多台VPS | 每台服务器密钥不同,容易搞混 | SSH Config统一管理 |
| 多平台账号 | GitHub个人+工作、GitLab、Gitee | 为每个平台生成独立密钥 |
| 私钥设置了passphrase | 每次连接都要输密码,烦死 | SSH Agent + Keychain |
| 不同操作系统 | Mac/Windows/手机各有各的坑 | 统一流程+针对性配置 |
| 密钥泄露应急 | 某台电脑丢了,所有服务器都要换密钥 | 密钥分层+快速轮换 |
整体架构
这个架构让你能:
- 用不同密钥访问不同服务器(单点故障隔离)
- 一个命令连接任何服务器(省心)
- 私钥passphrase只输一次(省事)
- 电脑丢了,撤回特定密钥就行(安全)
3、操作步骤
3.1 生成密钥对
ed25519 vs RSA:怎么选?
| 算法 | 密钥长度 | 性能 | 兼容性 | 推荐场景 |
|---|---|---|---|---|
| ed25519 | 短(32字节) | 快 | 新系统 | 首选,现代服务器 |
| RSA 4096 | 长(4KB) | 慢 | 所有系统 | 老旧系统、特殊兼容需求 |
现在的选择:新密钥全部用 ed25519。主流 VPS 商(Vultr · DigitalOcean · Linode · AWS 等)2020 年后的系统都支持 ed25519,放心用。只有当你要连 2017 年前的老系统时,才考虑 RSA 4096。
为不同用途生成不同密钥
尽量一把密钥对应一个用途,方便出问题时单独撤回。为每个场景生成独立密钥:
1 | # 1. 默认密钥(用于大部分VPS) |
参数说明:
-t ed25519:使用ed25519算法-f filename:指定密钥文件名(不用默认的id_ed25519)-C comment:添加注释,方便识别(可以是你邮箱、用途描述)
设置passphrase
passphrase 就是"加密密码",保护你的私钥文件。私钥丢了但有 passphrase,别人也用不了。
生成密钥时会提示:
1 | Enter passphrase (empty for no passphrase): |
强烈建议设置passphrase! 这是私钥的最后一道防线,电脑丢了还能保护你的服务器。
好的passphrase:
- 长度≥12个字符
- 混合大小写、数字、符号
- 可以是一句话(空格分隔的多个单词)
💡 passphrase vs 密码
passphrase通常是一句话,比传统密码更长、更容易记,安全性和用户体验都更好。
3.2 上传公钥到服务器
方法A:ssh-copy-id(推荐)
这是最简单的方式,Mac/Linux自带:
1 | # 上传默认密钥 |
输入一次密码,公钥就自动配置好了。
参数说明:
-i identity_file:指定要上传的公钥文件-p port:指定 SSH 端口(很老的 ssh-copy-id 不支持-p,改用-o "Port=22000")
方法B:手动复制
Windows用户或ssh-copy-id不可用时:
1 | # 1. 查看公钥内容 |
方法C:Windows PowerShell
Windows 10/11自带OpenSSH,可以这样:
1 | # 生成密钥 |
验证配置
1 | # 测试密钥登录(应该不需要输密码) |
⚠️ 常见坑
- 权限不对:
.ssh必须是700,authorized_keys必须是600- 公钥复制错了:确保是一整行,没有换行或空格
- 用户搞错了:
~/.ssh在服务器上是目标用户的home目录
3.3 SSH Config管理多服务器
这是 SSH 管理的核心——配好后你不用记 IP、端口、用户名。
配置文件位置
在你的本地电脑上编辑(用任意编辑器 nano/vim/VSCode):
1 | # 方法1:用 nano(简单,文件不存在会自动创建) |
基本配置模板
1 | # 全局设置(应用于所有连接) |
参数说明:
Host:别名,你用这个名字连接HostName:真实域名或IPUser:登录用户名Port:SSH端口IdentityFile:私钥文件路径IdentitiesOnly yes:只用指定密钥,避免 SSH 傻傻试遍所有密钥导致服务器拒绝连接(报错 Too many authentication failures)AddKeysToAgent yes:自动把密钥加到ssh-agent
使用方法
配置好后,连接只用别名:
1 | # 以前要这样 |
高级技巧
通配符匹配:
1 | # 所有AWS服务器都用同一个密钥 |
include子配置文件:
1 | # ~/.ssh/config |
这样可以把不同用途的配置分开管理,适合复杂环境。
3.4 SSH Agent配置
如果你的私钥设置了passphrase,每次连接都要输入很烦。SSH Agent帮你缓存解密后的私钥,passphrase只输一次。
Mac/Linux配置
启动ssh-agent:
1 | # 启动agent |
自动启动(推荐):
在 ~/.bashrc 或 ~/.zshrc 添加:
1 | # 1. 打开配置文件(Mac 用 nano ~/.zshrc,Linux 用 nano ~/.bashrc) |
Mac Keychain集成:
Mac可以把passphrase存到系统钥匙串,以后自动解锁:
1 | # 添加密钥时存到keychain(macOS Monterey 12.0 及以后) |
Windows配置
Windows 10/11的OpenSSH自带ssh-agent服务:
启用服务:
1 | # 以管理员身份运行PowerShell |
Git Bash配置:
在 ~/.bashrc 或 ~/.bash_profile 添加:
1 | # 启动ssh-agent |
验证Agent工作
1 | # 查看agent中的密钥 |
3.5 不同客户端配置
VSCode Remote SSH
很多出海开发者用VSCode直接连服务器开发,配置SSH密钥后超级方便:
安装插件:
- VSCode 左侧点击扩展图标(或按
Cmd+Shift+XMac /Ctrl+Shift+XWindows) - 搜索 “Remote - SSH”
- 点击 Install 安装
配置连接:
按 Cmd+Shift+P(Mac)或 Ctrl+Shift+P(Windows),输入 Remote-SSH: Connect to Host,选择你在 ~/.ssh/config 中配置的别名。
指定密钥:
如果VSCode找不到密钥,在SSH config中明确指定:
1 | Host vps-dev |
Termius / MobaXterm 等第三方工具
这些工具有图形界面,密钥配置方式:
Termius(我用这个,跨设备同步密钥很方便):
- Preferences → Keys → Import Key
- 选择你的私钥文件
- 新建Host时,在Key field选择导入的密钥
MobaXterm(免费版够用):
- Tools → MobaKeyGen 生成或导入密钥
- Session配置 → SSH settings → Use private key
- 选择你保存的
.ppk文件
💡 格式转换
某些Windows工具需要PuTTY格式的
.ppk文件,用PuTTYgen转换:
- 打开PuTTYgen
- Load → 选择你的OpenSSH私钥
- Save private key → 保存为
.ppk
手机端应急
Termius (iOS/Android):
- 支持SSH密钥,可以从电脑同步或手动导入
- 设置好之后,手机也能应急管理服务器
JuiceSSH (Android):
- 支持密钥认证
- 可以生成新密钥或导入现有密钥
3.6 多账号场景(GitHub/GitLab等)
出海开发者通常有多个GitHub账号:个人项目、公司项目、为客户管理的账号。
为每个平台生成独立密钥
1 | # GitHub 个人账号 |
SSH Config配置
1 | # GitHub 个人 |
添加公钥到各平台
GitHub:
- Settings → SSH and GPG keys → New SSH key
- 粘贴
~/.ssh/github_personal.pub的内容 - Title设置为 “MacBook Pro” 或其他设备名
GitLab:
- Preferences → SSH Keys
- 粘贴公钥内容
- Add key
Git仓库配置
对于不同的GitHub账号,在仓库中设置不同的user(不同账号需要提交不同的作者信息,否则 commit 会显示错误的账号;这是仓库级配置,只对当前仓库生效):
1 | # 个人仓库 |
测试连接
1 | # 测试GitHub个人账号 |
💡 为什么要 IdentitiesOnly yes?
SSH默认会尝试所有找到的密钥,服务器会拒绝太多认证尝试。加上这个参数,SSH只尝试指定的密钥,更快更可靠。
3.7 禁用密码登录(最后一步,别急着做)
⚠️ 顺序铁律:先开一个新终端用密钥测通能登录,再禁密码。顺序反了会把自己锁在服务器外面。
密钥配好、测通后,把密码登录关掉,全网的爆破脚本就彻底没戏了:
1 | # 1. 先开一个新终端,用密钥测登录(原终端保持开着,留作回退) |
万一密钥登不上:原终端还开着,把 PasswordAuthentication 改回 yes、再 reload sshd 即可回退,不会把自己锁死。这一步是 SSH 安全的地基,但一定放在最后——前面所有密钥配置都是为了它能安全落地。
4、总结
关键要点回顾
| 主题 | 关键命令/配置 | 为什么要这么做 |
|---|---|---|
| 生成密钥 | ssh-keygen -t ed25519 -C "注释" |
不同用途用不同密钥,方便隔离和轮换 |
| 上传公钥 | ssh-copy-id -i key.pub user@host |
最简单的方式,自动配置权限 |
| SSH Config | ~/.ssh/config 配置文件 |
一个命令管理所有服务器,不用记IP端口用户名 |
| 多账号 | 用Host别名区分(github-work、github) | 同一平台多个账号,各自独立 |
| SSH Agent | ssh-add + AddKeysToAgent yes |
Passphrase只输一次,省时省力 |
| 权限检查 | chmod 700 ~/.ssh && chmod 600 authorized_keys |
SSH对权限要求严格,错了会拒绝密钥登录 |
| 测试连接 | ssh -v user@host |
用 -v 查详细日志,排查问题 |
配置文件位置速查
1 | 本地电脑: |
安全建议
- 密钥分层:生产环境、测试环境、个人账号用不同密钥
- 定期轮换:每半年到一年换一次密钥(特别是私钥没设passphrase的)
- 备份密钥:私钥加密备份到安全的地方(U盘、密码管理器)
- 监控登录:定期用
last命令查看登录记录 - 撤回密钥:电脑丢了,立即从服务器删除
~/.ssh/authorized_keys中的对应公钥
常用命令速查
1 | # 生成密钥 |
5、异常记录
Q1:还是提示输入密码?
诊断:
1 | # 用详细模式查看SSH在用什么认证方式 |
常见原因:
-
服务器上密钥没配置对
1
2
3# 在服务器上检查
cat ~/.ssh/authorized_keys
# 确认你的公钥在里面,是一整行,没有换行 -
权限问题(最常见)
1
2
3
4# 在服务器上修复
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R youruser:youruser ~/.ssh -
SSH配置禁用了密钥认证
1
2
3# 在服务器上检查
grep PubkeyAuthentication /etc/ssh/sshd_config
# 应该是:PubkeyAuthentication yes -
用错了私钥
1
2# 明确指定私钥
ssh -i ~/.ssh/correct_key user@host
Q2:权限太开放(Permissions are too open)?
错误信息:
1 | Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open. |
解决:
1 | # 修复私钥权限(必须600) |
💡 为什么SSH这么在意权限?
如果私钥文件能被其他用户读取,安全就没意义了。SSH严格检查权限,避免你无意中暴露私钥。
Q3:Windows上没有ssh-copy-id?
方法A:用PowerShell
1 | type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
方法B:手动复制
cat ~/.ssh/id_ed25519.pub- 复制输出
- SSH登录服务器,手动粘贴到
~/.ssh/authorized_keys
方法C:用第三方工具
Termius、MobaXterm等图形化工具都有密钥管理功能,比命令行更直观。
Q4:SSH Agent不工作?
检查agent是否运行:
1 | # Mac/Linux |
检查密钥是否已添加:
1 | ssh-add -l |
Windows服务没启动:
1 | # 以管理员身份运行 |
Q5:多个密钥SSH都试但都不对?
症状:
1 | Too many authentication failures |
原因:SSH默认会尝试所有找到的密钥,服务器拒绝太多尝试。
解决:在SSH config中加上 IdentitiesOnly yes
1 | Host myserver |
Q6:想换掉旧密钥?
步骤:
1 | # 1. 生成新密钥 |
Q7:密钥指纹不匹配?
首次连接会看到:
1 | The authenticity of host 'xxx' can't be established. |
验证指纹:
1 | # 从服务器获取指纹 |
指纹不匹配怎么办?
立即停止连接!可能是中间人攻击。联系服务商确认。
Q8:Git push提示权限拒绝?
问题:
1 | ERROR: Permission to username/repo.git denied to deploykey |
原因:密钥没对,或者SSH config没配置好。
解决:
1 | # 1. 测试SSH连接 |
6、进阶技巧
一键添加多个密钥到Agent
在 ~/.bashrc 或 ~/.zshrc 中添加:
1 | # 自动添加所有密钥到ssh-agent |
密钥过期提醒
创建一个定期任务检查密钥年龄:
1 |
|
密钥轮换脚本
1 |
|
7、FAQ(SSH 密钥最常问)
Q:ed25519 和 RSA 选哪个?
新装一律 ed25519——密钥短、握手快、抗碰撞强度高。老的 RSA 2048 还能用但没必要新生成;RSA 1024 必须立刻换。
Q:私钥 passphrase 忘了怎么办?
找不回,只能重新生成密钥对、重新上传公钥。所以 passphrase 存密码管理器(1Password/Bitwarden),别靠脑子记。
Q:一台电脑能放多把密钥吗?
能。~/.ssh/ 下放多把,用 ~/.ssh/config 的 IdentityFile 给每个 Host 指定对应密钥。别一把密钥走天下(一台泄露全沦陷)。
Q:换电脑怎么迁移密钥?
把 ~/.ssh/ 整个目录(含 .pub 和 config)拷过去,注意私钥权限 600。更稳的做法:新电脑新生成密钥,把旧公钥在服务器撤销。
Q:禁了密码登录会把自己锁外面吗?
会,所以顺序是:先配好密钥 → 开新终端用密钥测能登录 → 再禁密码。千万别先禁密码再配密钥。
下一篇预告
密钥配好、禁了密码,SSH 的地基就稳了。如果还没 VPS 练手,我推荐 Vultr · DigitalOcean。下一篇讲 SSH Config 进阶:Include 子配置、跳板机(ProxyJump)、连接复用,把多服务器管理再往前推一步。
这是「独立开发者工具箱」第 8 篇,系列持续更新中,帮你少踩坑多出海。
Sources:


