AWS 提供多种添加 HTTPS 的方式,具体取决于你的架构。正确的方法取决于你是否使用负载均衡器、CloudFront 还是独立的 EC2 实例。
决策树
Are you using an ALB, NLB, or CloudFront?
├── Yes → Use AWS Certificate Manager (ACM) — free, auto-renewing
└── No (standalone EC2)?
├── Can you install Certbot? → Certbot on EC2 (auto-renewing)
└── No root / quick setup? → GetHTTPS → manual install on EC2
方案一:AWS Certificate Manager (ACM) — 用于负载均衡器和 CloudFront
ACM 提供免费的 SSL 证书并自动续签。它们只能与 AWS 服务(ALB、NLB、CloudFront、API Gateway)配合使用——你无法下载私钥。
申请证书
- 在控制台中打开 AWS Certificate Manager
- 点击 Request a certificate → Request a public certificate
- 输入你的域名:
example.com、*.example.com - 选择验证方式:DNS validation(推荐)或 Email
- 点击 Request
DNS 验证
ACM 会给你一条需要添加到 DNS 的 CNAME 记录:
- Name:
_xxxx.example.com - Value:
_yyyy.acm-validations.aws
如果你的 DNS 托管在 Route 53,点击 “Create records in Route 53”——ACM 会自动添加。
绑定到 ALB
- 前往 EC2 → Load Balancers → 选择你的 ALB
- Listeners 标签 → 添加监听器(或编辑现有的)
- 协议:HTTPS,端口:443
- 默认操作:转发到你的目标组
- Default SSL/TLS certificate: 选择你的 ACM 证书
- 保存
绑定到 CloudFront
- 前往 CloudFront → 选择你的分配
- General 标签 → Edit
- Custom SSL certificate: 选择你的 ACM 证书(必须在
us-east-1) - 保存
方案二:EC2 上的 Let’s Encrypt(独立实例)
如果你运行的是没有负载均衡器的单个 EC2 实例,直接在服务器上安装证书。
使用 GetHTTPS(无需安装软件)
- 从 GetHTTPS 获取证书
- 将文件上传到你的 EC2 实例:
scp fullchain.pem privkey.pem ec2-user@your-ec2-ip:/etc/ssl/ - 在实例上配置 Nginx 或 Apache
使用 Certbot(自动续签)
# Amazon Linux 2023
sudo dnf install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com
# Ubuntu on EC2
sudo snap install --classic certbot
sudo certbot --nginx -d example.com
Certbot 会自动设置续签。
ACM 与 Let’s Encrypt 在 AWS 上的对比
| ACM | Let’s Encrypt (GetHTTPS/Certbot) | |
|---|---|---|
| 费用 | 免费 | 免费 |
| 适用于 ALB/CloudFront | ✅ | ❌ (无法轻松导入 LE 到 ACM) |
| 适用于 EC2 直接部署 | ❌ | ✅ |
| 自动续签 | ✅ (AWS 托管) | ✅ (Certbot) 或手动 (GetHTTPS) |
| 私钥访问 | ❌ (AWS 持有) | ✅ (你持有) |
| 通配符证书 | ✅ | ✅ |
| 非 AWS 用途 | ❌ | ✅ (可移植) |
经验法则: ALB 或 CloudFront 后面用 ACM。独立 EC2 实例用 Let’s Encrypt。
安全组配置
确保你的 EC2 或 ALB 安全组允许端口 80 和 443 的入站流量:
Type Protocol Port Source
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
端口 80 用于 HTTP→HTTPS 重定向以及 Let’s Encrypt HTTP-01 验证。
常见问题
可以直接在 EC2 上使用 ACM 证书吗?
不可以。ACM 证书只能附加到 AWS 托管服务(ALB、NLB、CloudFront、API Gateway)。你无法导出私钥。独立 EC2 请使用 GetHTTPS 或 Certbot。
可以将 Let’s Encrypt 证书导入 ACM 吗?
技术上可以(aws acm import-certificate),但不会通过 ACM 自动续签。你需要每 90 天重新导入一次。使用 ACM 原生证书配合 AWS 服务、使用 Let’s Encrypt 配合 EC2 会更简单。
ACM 证书应该选哪个 AWS 区域?
ALB/NLB:在与负载均衡器相同的区域申请证书。CloudFront:证书必须在 us-east-1(弗吉尼亚北部),不论你的源站在哪里。
ACM 真的免费吗?
是的。ACM 的公共 SSL/TLS 证书免费。每个证书不收费,续签也不收费。你只需为使用证书的 AWS 资源(ALB、CloudFront 等)付费。
如何为 ECS/Fargate 服务配置 SSL?
在 ECS 服务前放置一个 ALB,然后将 ACM 证书附加到 ALB 监听器。ALB 终结 TLS 并将 HTTP 转发到你的容器。这是 ECS 的标准模式。
如何为 S3 静态网站配置 SSL?
S3 静态网站托管不直接支持自定义 SSL 证书。在 S3 前面放置 CloudFront,并将 ACM 证书(来自 us-east-1)附加到 CloudFront 分配。
API Gateway 怎么处理?
AWS API Gateway 在 *.execute-api.region.amazonaws.com 上默认包含免费 SSL。对于自定义域名(如 api.example.com),创建 ACM 证书并在 API Gateway 中配置自定义域名。
在 AWS 上应该用 ACM 还是 GetHTTPS?
| 场景 | 推荐方案 |
|---|---|
| ALB / NLB / CloudFront | ACM — 免费、自动续签、原生集成 |
| 独立 EC2 | GetHTTPS 或 Certbot — ACM 无法导出密钥到 EC2 |
| ALB 后面的 EC2 | ACM 用于 ALB — EC2 不需要自己的证书 |
| ECS / Fargate | ACM 用于 ALB — 标准模式 |
| Lightsail | Lightsail 内置 — 包含免费 Let’s Encrypt |
如果你在纯 EC2 上没有负载均衡器,GetHTTPS 是获取证书最快的方式——无需 AWS CLI。