如何使用AWS ACM公共证书运行Gunicorn搭建Flask HTTPS API?
用AWS ACM证书部署Flask HTTPS API(Gunicorn/uWSGI)的可行方案
首先直接给结论:ACM颁发的公共证书没法直接拿来给Gunicorn或uWSGI用——因为ACM托管证书的逻辑是不让你下载私钥的,而Gunicorn/uWSGI这类应用服务器运行HTTPS必须要有证书文件和对应的私钥文件。
下面给你两种靠谱的解决思路:
1. 用AWS应用负载均衡器(ALB)做HTTPS终止(最推荐)
这是AWS官方最推崇的做法,操作起来也简单:
- 把你的ACM证书绑定到ALB的443端口(HTTPS),让负载均衡器来处理SSL加密解密
- ALB把解密后的HTTP请求转发给后端跑Gunicorn/uWSGI的服务器(比如EC2实例、ECS容器),后端只需要监听普通的HTTP端口(比如80或8000)
- 你的Flask应用完全不用管SSL的事,正常写代码就行
这种方式的好处:
- ACM会自动给证书续期,不用你手动维护
- 负载均衡器帮你扛下SSL卸载的压力,应用服务器只专注处理业务请求
- 后续扩容、加域名都方便
2. 仅在特定场景下导出ACM证书(局限性大)
只有当你的ACM证书是你自己上传到ACM的(不是ACM免费颁发的公共证书),并且你手里有证书的私钥,才能导出证书文件和私钥。如果符合这个条件,可以用AWS CLI导出:
aws acm export-certificate --certificate-arn <你的证书ARN> --passphrase <加密私钥的密码>
导出后你会得到证书链、证书文件,还有加密的私钥。解密私钥后,把证书存成server.crt,私钥存成server.key,就能用Gunicorn启动了:
gunicorn --certfile=server.crt --keyfile=server.key test:app
但如果是ACM免费给你颁发的公共域名证书,这条路走不通,因为ACM不会让你下载私钥。
3. Nginx反向代理配合ACM证书(略复杂)
要是你非得在服务器层面处理HTTPS,可以用Nginx做反向代理,Nginx能通过IAM角色自动获取ACM证书(不用手动下载),再转发请求给uWSGI:
- 给你的EC2实例加个IAM角色,要有
acm:GetCertificate的权限 - 安装工具让Nginx自动拉取ACM证书,配置Nginx监听443端口,把请求转发给uWSGI的套接字或TCP端口
- uWSGI正常运行Flask应用就行
不过这种配置步骤多,维护起来不如ALB省心,不优先推荐。
总结:如果是ACM免费颁发的公共证书,直接用ALB做HTTPS终止是最省事的;要是必须在应用层用证书,只能用自己上传到ACM的可导出证书,不然没法直接给Gunicorn/uWSGI用。
内容的提问来源于stack exchange,提问作者Mah_Bar
相关产品推荐
相关产品推荐

