通过GitHub Actions部署Docker到EC2时遇SSH认证失败求助
解决GitHub Actions SSH到EC2认证失败的问题
核心问题分析
你遇到的ssh: handshake failed错误,主要有两个关键原因:
- 不必要的嵌套SSH命令:你用
appleboy/ssh-action已经成功建立了到EC2的SSH连接,但脚本里又重复执行ssh命令,相当于在EC2实例内部再尝试SSH登录自己,完全多余,还会因为EC2本地没有对应认证密钥导致失败。 - 可能的私钥配置或环境问题:私钥格式错误、EC2安全组未开放SSH端口、sshd配置禁用公钥认证等也会引发该问题。
分步解决方案
1. 修复Deploy步骤的脚本(最关键)
删除脚本里所有嵌套的ssh命令,appleboy/ssh-action会直接在EC2实例上执行你编写的脚本命令,无需手动重复SSH。修改后的步骤如下:
- name: Deploy to EC2 uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_PRIVATE_KEY }} script: | # 登录ECR(需给EC2配置IAM角色或AWS凭证) aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }} # 拉取ECR上的最新镜像 docker pull ${{ steps.login-ecr.outputs.registry }}/cicd:latest # 停止并移除旧容器 docker stop my-container || true docker rm my-container || true # 启动新容器 docker run -d --name my-container -p 8383:8383 ${{ steps.login-ecr.outputs.registry }}/cicd:latest
提示:推荐给EC2附加具有ECR拉取权限的IAM角色,无需在实例上存储AWS凭证,更安全。
2. 检查GitHub Secrets里的私钥格式
确保EC2_PRIVATE_KEY是完整的.pem文件内容:
- 必须包含开头的
-----BEGIN RSA PRIVATE KEY-----和结尾的-----END RSA PRIVATE KEY----- - 中间的每一行换行都要保留,粘贴时不要把整个私钥合并成一行(GitHub Secrets会自动保留换行)
3. 验证EC2的安全组配置
- 入站规则必须允许**22端口(SSH)**的访问,测试阶段可暂时设置来源为
0.0.0.0/0,正式环境建议限制为GitHub Actions的IP段 - 出站规则允许所有流量,确保EC2能拉取ECR镜像和访问外网
4. 检查EC2的sshd配置
登录EC2实例,编辑/etc/ssh/sshd_config,确保以下配置未被注释:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
修改后重启sshd服务:
sudo systemctl restart sshd
同时检查EC2用户(如ubuntu或ec2-user)的~/.ssh/authorized_keys文件,里面必须包含你密钥对的公钥内容(创建EC2时选择的密钥对,公钥会自动写入该文件)。
额外提示
- 建议将触发分支从
master改为main,GitHub已将默认分支名统一为main - 尽量用IAM角色替代手动配置AWS凭证,提升安全性
内容的提问来源于stack exchange,提问作者Ganesh Yadav
相关产品推荐
相关产品推荐

