如何为EC2实例的内部及外部IP均启用HTTPS?
解决方案
方案1:用私有DNS让内部流量走内网(最简便,推荐)
不用改现有证书或Nginx配置,让内部系统继续用FQDN访问,但自动解析到内部IP走VPC内网:
- 在AWS Route 53创建私有托管区,托管你的服务域名(比如
api.yourdomain.com)。 - 在私有托管区加一条A记录,把域名指向EC2的内部IP。
- 把你的VPC和这个私有托管区关联上,这样VPC里的机器解析域名时会拿到内部IP,流量完全在VPC里跑;外部用户解析域名还是得到Elastic IP,正常走公网。
- 保持Nginx原有配置不动,不管内外都是用域名访问,证书匹配,不会有SSL报错。
方案2:给Nginx加双Server块,支持域名和内部IP访问
如果必须让内部系统直接用IP访问,可以给Nginx单独加一个处理内部IP的server块:
- 搞定内部IP的SSL证书:
私有IP(比如10.x.x.x)没法从Let's Encrypt获取公网证书,你得自己用私有CA签发证书,或者生成自签证书。 - 修改Nginx配置:
加两个server块,分别处理域名和内部IP请求:# 原有的公网域名处理配置 server { listen 443 ssl; server_name api.yourdomain.com; ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem; # 你的API代理或业务配置... } # 新增的内部IP处理配置 server { listen 443 ssl; server_name 10.0.0.10; # 换成你的EC2内部IP ssl_certificate /path/to/internal-ip-cert.pem; ssl_certificate_key /path/to/internal-ip-key.pem; # 和域名块复用相同的API逻辑 location / { proxy_pass http://localhost:8080; # 换成你的API端口 # 其他proxy相关配置... } } - 让内部客户端信任证书:
因为这个内部IP的证书不是公网可信CA发的,得把证书导入内部客户端的信任列表里(比如Linux导到/etc/ssl/certs,Windows用证书管理器添加),不然还是会报SSL错误。
方案3:结合AWS ACM私有证书和内部DNS
如果全用AWS生态,可以这么搞:
- 在AWS ACM里申请私有证书,可以包含你的域名和内部IP。
- 把这个证书导出后配置到Nginx里(或者改用ALB挂载证书,把流量转发到EC2)。
- 配合Route 53私有托管区,让内部解析域名到私IP,同时内部客户端信任ACM的私有CA,这样不管用域名还是内部IP访问都能正常走HTTPS。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

