悠悠楠杉
网站页面
正文:
在CI/CD流程中,处理敏感数据(如SSH密钥、TLS证书等)是常见需求。GitHub Actions虽然提供了secrets功能,但直接传递多行PEM密钥时,往往会因格式问题导致失败。本文将深入解析如何高效、安全地实现这一需求。
PEM格式的密钥通常包含多行文本和特殊字符(如-----BEGIN RSA PRIVATE KEY-----)。当直接将其存入GitHub Secrets并作为环境变量传递时,换行符会被截断,导致密钥失效。例如:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAz7X...
-----END RSA PRIVATE KEY-----在Actions中直接输出时,可能变成单行字符串,破坏密钥结构。
核心思路:将多行PEM密钥转换为单行Base64字符串,传递后再解码还原。
使用以下命令将PEM文件转换为Base64字符串(以Linux/macOS为例):
# 编码为Base64并移除换行符
cat private-key.pem | base64 | tr -d '\n'
# 输出示例:LS0tLS1CRUdJTiBSU0EgUF...
将生成的字符串保存到GitHub仓库的Settings > Secrets中,命名为PEM_KEY_BASE64。
在Workflow中,通过base64 -d解码并写入文件:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Restore PEM Key
run: |
echo "${{ secrets.PEM_KEY_BASE64 }}" | base64 -d > private-key.pem
chmod 600 private-key.pem # 关键:确保权限安全
- name: Use Key
run: ssh -i private-key.pem user@host如果不想依赖Base64,可通过转义换行符实现:
1. 手动转义:在Secrets中将所有换行符替换为\n(实际输入\n字符)。
2. Workflow处理:
run: |
echo "${{ secrets.PEM_KEY }}" | sed 's/\\n/\n/g' > private-key.pem- name: Cleanup
run: rm -f private-key.pem
if: always()yaml
env:
ACTIONS_STEP_DEBUG: false以下是通过SSH密钥部署代码的完整示例:
jobs:
deploy:
steps:
- uses: actions/checkout@v4
- name: Setup SSH Key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.AWS_EC2_KEY_BASE64 }}" | base64 -d > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
- name: Copy Files
run: scp -r ./dist ec2-user@example.com:/var/www通过Base64编码或换行符转义,可完美解决GitHub Actions中多行PEM密钥的传递问题。选择方案时需权衡可读性与安全性,并始终遵循密钥管理的最佳实践。