一次 GitHub Actions SSH 部署密钥"失踪"后的完整排查与重建记录(AWS EC2 实战)
记录一次真实的 GitHub Actions 部署排查过程,
重点解决:
- SSH Key 找不到
- 是否会影响已有 Action
- AWS EC2 root / ec2-user 登录限制
- 安全、可控地重建部署密钥
一、问题背景
之前项目已经通过 GitHub Actions → SSH → 服务器 实现过自动部署,但隔了一段时间后:
- Action YAML 还在
- Secrets 名字记得
- SSH Key 不知道放哪了
- 本地
~/.ssh目录下也找不到私钥
核心疑问:
如果重新生成 SSH Key,会不会影响服务器上已有的 GitHub Actions?
二、第一步:确认私钥是否还存在
1️⃣ 查看本地 SSH 目录
bash
ls ~/.ssh
结果只有:
text
authorized_keys
known_hosts
结论:
- ❌ 本地已无任何 SSH 私钥
- ❌ GitHub Secrets 中的私钥无法导出
- 👉 旧 key 实际上已经无法恢复
三、关键结论:不要"找旧 key",直接新增一把
SSH 的核心机制是:
服务器通过
authorized_keys维护一个 key 列表(白名单)
每一行 key 彼此独立,互不影响
只要做到:
- 追加 key
- 不删除旧 key
👉 不会影响任何已有 Action 或人工登录
四、安全重建 SSH Key(推荐做法)
1️⃣ 在本地生成新的 SSH Key(Windows 示例)
bash
ssh-keygen -t ed25519 -C "github-action-new"
指定保存路径和文件名,例如:
text
D:\github-action-key\id_ed25519
生成结果:
text
id_ed25519 # 私钥(给 GitHub)
id_ed25519.pub # 公钥(给服务器)
⚠️ 不要设置 passphrase(GitHub Actions 无法交互输入)
五、服务器端关键细节(AWS EC2 坑点)
1️⃣ AWS EC2 默认禁止 root 直登
在 EC2 上查看 root 的 authorized_keys,会看到类似内容:
text
command="Please login as ec2-user rather than root" ssh-rsa AAAA...
含义:
- 即使 key 正确
- 只要用
root登录 - 会被强制踢下线
👉 正确用户应为:ec2-user
六、最容易犯的错误(也是本次问题根因)
❌ 把 key 加到了 root,却用 ec2-user 登录
SSH 的规则是:
| 登录用户 | 使用的 authorized_keys |
|---|---|
| root | /root/.ssh/authorized_keys |
| ec2-user | /home/ec2-user/.ssh/authorized_keys |
👉 用户不一致,100% 登录失败
七、正确做法:给 ec2-user 添加公钥
1️⃣ 切换到 ec2-user 的 SSH 目录
bash
mkdir -p /home/ec2-user/.ssh
2️⃣ 追加公钥(不要删除原内容)
bash
vi /home/ec2-user/.ssh/authorized_keys
追加一行(示例):
text
ssh-ed25519 AAAA... github-action-new
3️⃣ 修正权限(非常重要)
bash
chown -R ec2-user:ec2-user /home/ec2-user/.ssh
chmod 700 /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
八、本地验证(最重要的一步)
在本地执行:
bash
ssh -i D:\github-action-key\id_ed25519 ec2-user@服务器IP
如果能直接登录:
text
[ec2-user@ip-xxx ~]$
👉 说明:
- key 生效
- 用户正确
- GitHub Actions 一定能连
九、GitHub Actions Secrets 配置规范
在仓库中配置:
Settings → Secrets and variables → Actions
| Secret 名称 | 内容 |
|---|---|
| SERVER_HOST | 服务器 IP / 域名 |
| SERVER_USER | ec2-user |
| SERVER_SSH_KEY | 私钥全文 |
十、Action 示例(SSH 连通性测试版)
yaml
- name: SSH Test
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
echo "SSH connected"
hostname
建议:
- 先用 echo / hostname
- 确认没问题再跑部署脚本
十一、最佳实践总结(强烈推荐)
✅ 1. 每个用途一把 key
text
github-action-prod
github-action-test
manual-login
✅ 2. 不复用、不覆盖旧 key
- 新增
- 验证
- 稳定后再清理
✅ 3. 永远先本地 ssh 成功,再跑 Action
十二、最终结论
- SSH Key 丢失 ≠ 项目废了
- 追加 key 是最安全、最低风险的恢复方式
- AWS EC2 必须使用
ec2-user - 用户和
authorized_keys不一致,是最隐蔽、也最致命的坑