EC2上无域名部署Django并配置免费SSL证书实现HTTPS
问题解答
首先明确结论:主流免费SSL证书颁发机构(如Let's Encrypt)不支持直接为公网IP颁发证书,因为ACME协议的验证机制(HTTP-01、DNS-01)均依赖域名完成身份校验,公网IP无法满足这些验证要求。
针对你的场景,提供几个可行的解决思路:
1. 自签名证书 + 反向代理(测试/内部环境可用)
生成自签名SSL证书,搭配Nginx反向代理实现EC2上Django服务的HTTPS访问:
- 在EC2服务器执行命令生成自签名证书:
openssl req -x509 -newkey rsa:4096 -keyout /etc/ssl/private/django-key.pem -out /etc/ssl/certs/django-cert.pem -days 365 -nodes - 配置Nginx转发HTTPS请求到Django的HTTP端口(默认8000),在Nginx配置文件中添加如下server块:
server { listen 443 ssl; server_name <你的EC2公网IP>; ssl_certificate /etc/ssl/certs/django-cert.pem; ssl_certificate_key /etc/ssl/private/django-key.pem; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 注意:自签名证书会被浏览器标记为“不安全”,需要前端服务手动信任该证书,仅适合测试或内部使用。
2. 临时HTTPS隧道(快速测试用)
使用ngrok之类的工具为EC2上的Django服务生成临时HTTPS地址:
- 在EC2上安装ngrok后执行:
ngrok http 8000 - 工具会生成一个带HTTPS的临时域名(如
https://xxxx-xx-xx-xx-xx.ngrok.io),前端可直接访问该地址。 - 缺点:域名临时且带宽有限,仅适合短期测试。
3. 免费域名 + 正规SSL证书(生产环境推荐)
这是生产环境的标准解决方案:
- 申请免费二级域名,将其解析到你的EC2公网IP。
- 使用Let's Encrypt申请免费SSL证书,搭配Nginx或Apache实现SSL终止,将HTTPS请求转发到Django服务(用Gunicorn/uWSGI替代
runserver作为生产服务器)。
重要提醒
python manage.py runserver是Django的开发服务器,性能和安全性都不满足生产环境要求,生产环境必须使用Gunicorn、uWSGI等专业应用服务器,配合Nginx/Apache做反向代理和SSL处理。
内容的提问来源于stack exchange,提问作者vishnu vardhan Gowd
相关产品推荐
相关产品推荐

