如何在GitHub Actions中正确存储使用SSH的PEM文件?部署EC2遇权限报错
解决GitHub Actions部署EC2时的"Load key"和"Permission denied"错误
核心错误原因
- 私钥格式损坏:
echo "$SSH_PRIVATE_KEY"会自动将私钥中的换行符替换为空格,导致密钥格式无效,触发Load key "web-server.pem": error in libcrypto。 - 变量引用错误:工作流中
env定义了EC2_USER: ubuntu,但SSH命令里误用${{ secrets.EC2_USER }},若Secrets未配置该值,会导致登录用户名错误。 - 权限配置问题:即便执行了
chmod 600,若文件创建时权限继承异常,仍会触发SSH的严格权限检查。 - EC2公钥未配置:本地私钥对应的公钥未添加到EC2实例的
~/.ssh/authorized_keys,直接导致Permission denied (publickey)。
正确配置方案
1. 修复私钥写入逻辑
用printf替代echo,确保私钥的换行符完整保留:
name: Deploy to EC2 env: SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }} EC2_HOST: ${{ secrets.EC2_HOST }} EC2_USER: ubuntu jobs: deploy: runs-on: ubuntu-latest steps: - name: Deploy to EC2 run: | printf "%s" "$SSH_PRIVATE_KEY" > web-server.pem chmod 600 web-server.pem # 使用env中定义的EC2_USER变量,而非secrets ssh -i web-server.pem -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST "echo '连接成功'"
2. 验证私钥完整性
- 确认GitHub Secrets中
EC2_SSH_KEY包含完整的-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----,且每行末尾的换行符未丢失。 - 本地执行
ssh-keygen -y -f your-key.pem生成对应公钥,对比EC2实例~/.ssh/authorized_keys是否包含该公钥。
3. 检查EC2实例权限配置
登录EC2实例执行以下命令,确保权限符合SSH要求:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
4. 优化方案:使用SSH Agent避免文件写入
直接将私钥加载到SSH Agent,减少文件权限问题:
name: Deploy to EC2 jobs: deploy: runs-on: ubuntu-latest steps: - name: 初始化SSH Agent uses: webfactory/ssh-agent@v0.7.0 with: ssh-private-key: ${{ secrets.EC2_SSH_KEY }} - name: 部署到EC2 run: | ssh -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_HOST }} "echo '连接成功'"
排查调试技巧
- 在工作流中添加调试步骤,查看私钥内容是否正确:
run: | echo "检查私钥格式:" cat web-server.pem - 查看EC2实例的
/var/log/auth.log日志,获取SSH登录失败的详细原因。
内容的提问来源于stack exchange,提问作者tarun pandey
相关产品推荐
相关产品推荐

