如何从AWS Secrets Manager获取证书密钥用于Gunicorn HTTPS配置
Gunicorn加载AWS Secrets Manager中SSL证书的配置方法
前置要求
运行Gunicorn的计算资源(EC2实例、ECS任务、EKS Pod等)绑定的IAM身份,必须提前授予对应Secret的secretsmanager:GetSecretValue操作权限,无需在环境中硬编码访问密钥。
运行环境需要提前预装AWS CLI和JSON解析工具jq,用于拉取和解析Secret内容。
方案1:临时内存文件启动(生产环境推荐)
Gunicorn的证书、密钥参数仅支持读取文件系统路径,最稳妥的方式是服务启动前拉取证书写入内存临时文件系统,进程退出后自动清理,不会持久化存储到磁盘。
- 建议将SSL证书、私钥存储在同一个Secret中,两个值的键名分别设为
ssl_cert、ssl_key,减少接口调用次数。如果分开存储在两个独立Secret中,分别拉取即可。 - 编写服务启动脚本
start_gunicorn.sh:
#!/bin/bash set -euo pipefail # 在tmpfs内存分区创建临时文件,不会写入物理磁盘 CERT_PATH=$(mktemp /tmp/gunicorn_cert.XXXXXX) KEY_PATH=$(mktemp /tmp/gunicorn_key.XXXXXX) # 注册退出钩子,进程终止时自动删除临时文件 cleanup() { rm -f "$CERT_PATH" "$KEY_PATH" } trap cleanup EXIT # 拉取Secret内容,将<YOUR_SECRET_NAME>替换为实际的Secret名称 SECRET_RAW=$(aws secretsmanager get-secret-value \ --secret-id <YOUR_SECRET_NAME> \ --query SecretString \ --output text) # 解析证书、私钥写入临时文件 echo "$SECRET_RAW" | jq -r '.ssl_cert' > "$CERT_PATH" echo "$SECRET_RAW" | jq -r '.ssl_key' > "$KEY_PATH" # 收紧文件权限,仅当前运行用户可读 chmod 600 "$CERT_PATH" "$KEY_PATH" # 启动Gunicorn exec gunicorn --certfile="$CERT_PATH" --keyfile="$KEY_PATH" test:app
- 给脚本添加执行权限:
chmod +x start_gunicorn.sh,后续服务启动直接执行该脚本即可。
方案2:无文件进程替换方案(更高安全性)
如果要求证书全程不落盘,可以用Bash进程替换的方式,通过虚拟文件路径把内存中的证书内容传给Gunicorn,全程不会在文件系统生成实体文件。
启动脚本示例:
#!/bin/bash set -euo pipefail SECRET_RAW=$(aws secretsmanager get-secret-value \ --secret-id <YOUR_SECRET_NAME> \ --query SecretString \ --output text) SSL_CERT=$(echo "$SECRET_RAW" | jq -r '.ssl_cert') SSL_KEY=$(echo "$SECRET_RAW" | jq -r '.ssl_key') # 通过进程替换传入虚拟文件路径 exec gunicorn --certfile=<(echo "$SSL_CERT") --keyfile=<(echo "$SSL_KEY") test:app
注意:该方案依赖
/proc文件系统支持,部分精简容器镜像、旧版本Gunicorn可能存在兼容性问题,上线前需要提前验证。
运维提示
- 证书轮换后,重启Gunicorn进程即可自动拉取最新的证书内容,无需修改配置
- 不要给临时文件设置过宽的读权限,避免私钥被服务器上的其他进程窃取
- 禁止将SSL私钥内容硬编码在启动脚本、容器镜像或环境变量中,所有权限通过IAM策略管控
内容的提问来源于stack exchange,提问作者Rohan Khadapkar
相关产品推荐
相关产品推荐

