云和 CDN

AWS 应用负载均衡器(ALB)用 ACM 证书配置 HTTPS

作者: · 最后核实

AWS 应用负载均衡器(ALB)配置 HTTPS 分三步:在 ACM 申请免费证书并用 DNS 验证,把证书挂到 443 监听器,再把 80 端口改成 301 跳转。DNS 验证的 ACM 证书到期前由 ACM 自动续期。

命令用 AWS CLI v2(控制台步骤相同),以截至 2026 年 11 月的 ACM 和 Elastic Load Balancing 为准。用亚马逊云科技中国区(北京、宁夏)的读者,先看下一节。

全球区域和中国区有什么不同

ALB 加 ACM 的做法在中国区基本一样,差别在账户、ARN、CloudFront 和端口备案。

  • 运营方和账户:中国区由本地合作伙伴运营,北京区域(cn-north-1)由光环新网运营,宁夏区域(cn-northwest-1)由西云数据运营。要用中国区必须单独注册亚马逊云科技中国区账户,凭证和全球账户不通用,全球账户也登录不了中国区控制台。
  • ARN 前缀:中国区资源的 ARN 以 arn:aws-cn: 开头,下面命令里的 ARN 要整段换成中国区的,比如 arn:aws-cn:elasticloadbalancing:cn-north-1:...。
  • ACM 可以用:ACM 从 2020 年 3 月起在两个中国区域都能签发公有证书,并部署到 ELB、API Gateway 等集成服务,官方的中国区说明页写明 ACM 与全球区域没有差异。所以下面的申请、DNS 验证和自动续期步骤在中国区同样适用。
  • CloudFront 不支持 ACM:中国区的 CloudFront 目前不支持 ACM,只能把第三方 CA 签发的证书上传到 IAM 证书库再关联;而且 *.cloudfront.cn 默认域名不能直接对外提供内容,必须配置已备案的自定义域名(CNAME)。
  • 端口和备案:按国内法规,中国区默认关闭 80、8080、443 端口。北京区域通过光环新网、宁夏区域通过西云数据办理 ICP 备案,备案流程的最后一步才是开放这几个端口。没有备案或许可证的域名不得提供互联网信息服务,所以 ALB 的 HTTPS 监听器要等备案完成后才能对外提供服务。

网站不托管在中国大陆境内的,继续用全球区域的账户即可,下面的流程不变,也不涉及中国区的备案和端口限制。

前提条件

ALB 和目标组要已经能用 HTTP 正常提供服务。

  • 已配置好的 AWS CLI v2,有 ACM 和 Elastic Load Balancing 权限(aws sts get-caller-identity 能正常返回)。
  • 一个面向互联网的 ALB、它的目标组和两者的 ARN;安全组放行入站 80 和 443。
  • 能修改域名 DNS(Route 53 或其他服务商,国内的云解析、DNSPod 都可以),用来添加验证 CNAME,并把 example.com 指向 ALB。
  • 如果设置了 CAA 记录,要允许 Amazon(amazon.com、amazontrust.com、awstrust.com 或 amazonaws.com 之一),可以用 CAA 检查 确认。
  • 中国区:域名已完成 ICP 备案,80 和 443 端口已开放。

第一步:申请证书

ACM 证书按区域划分,要在 ALB 所在的区域申请:

export AWS_REGION=eu-west-1        # 中国区换成 cn-north-1 或 cn-northwest-1
CERT_ARN=$(aws acm request-certificate \
  --domain-name example.com \
  --subject-alternative-names www.example.com \
  --validation-method DNS \
  --key-algorithm EC_prime256v1 \
  --query CertificateArn --output text)
echo "$CERT_ARN"

EC_prime256v1 申请的是 ECDSA 密钥,需要兼容很老的客户端时改用 RSA_2048。

第二步:添加 DNS 验证记录

ACM 用 CNAME 记录验证域名,先列出它要求的记录:

aws acm describe-certificate --certificate-arn "$CERT_ARN" \
  --query 'Certificate.DomainValidationOptions[].ResourceRecord' --output table

到 DNS 服务商逐条添加(域名在 Route 53 时,控制台的证书页面有 Create records in Route 53 按钮)。国内 DNS 服务商的“主机记录”一栏通常只填前缀,不要把完整域名填进去。然后等待验证完成:

aws acm wait certificate-validated --certificate-arn "$CERT_ARN"

这条 CNAME 以后也不要删,自动续期要靠它。

第三步:创建 HTTPS 监听器

HTTPS 监听器在 443 端口终止 TLS,引用 ACM 证书和安全策略,再把请求转发到目标组:

ALB_ARN=arn:aws:elasticloadbalancing:eu-west-1:111122223333:loadbalancer/app/web/0123456789abcdef
TG_ARN=arn:aws:elasticloadbalancing:eu-west-1:111122223333:targetgroup/web/0123456789abcdef
aws elbv2 create-listener --load-balancer-arn "$ALB_ARN" \
  --protocol HTTPS --port 443 \
  --certificates CertificateArn="$CERT_ARN" \
  --ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \
  --default-actions Type=forward,TargetGroupArn="$TG_ARN"

把 ARN 换成你自己的(aws elbv2 describe-load-balancers 和 describe-target-groups 能查到),中国区的 ARN 以 arn:aws-cn: 开头。ELBSecurityPolicy-TLS13-1-2-2021-06 同时启用 TLS 1.3 和 1.2;各区域可用的新策略用 aws elbv2 describe-ssl-policies 查看。TLS 1.3 现行规范是 2026 年 7 月发布的 RFC 9846。

第四步:HTTP 跳转 HTTPS,并把域名指向 ALB

把 80 端口监听器的默认动作改成跳转(没有就先创建一个):

HTTP_LISTENER_ARN=$(aws elbv2 describe-listeners --load-balancer-arn "$ALB_ARN" \
  --query 'Listeners[?Port==`80`].ListenerArn' --output text)
aws elbv2 modify-listener --listener-arn "$HTTP_LISTENER_ARN" \
  --default-actions 'Type=redirect,RedirectConfig={Protocol=HTTPS,Port=443,StatusCode=HTTP_301}'

然后把 example.com(Route 53 用别名记录)和 www.example.com(别名或 CNAME)指向 ALB 的 DNS 名称。用国内 DNS 服务商时,根域名不能设 CNAME 的,可以只让 www 指向 ALB,再把根域名跳转到 www。

验证

配置正确时,证书颁发者是 Amazon,http:// 返回 301 跳转到 https://。用 SSL 证书检查 从外部检查,或在终端运行:

curl ssl.sh/example.com
curl -sI http://example.com | grep -iE '^(HTTP|location)'

在 AWS 里查看证书状态、关联的资源和到期时间:

aws acm describe-certificate --certificate-arn "$CERT_ARN" --query 'Certificate.[Status,InUseBy,NotAfter]'

自动续期

DNS 验证的 ACM 公有证书会自动续期,前提有两个:证书仍关联在 ALB 这类 AWS 服务上,验证用的 CNAME 一直留在 DNS 里。续期后 ARN 不变,监听器不用任何改动。随时可以查看续期状态:

aws acm describe-certificate --certificate-arn "$CERT_ARN" --query 'Certificate.RenewalSummary'

导入到 ACM 的证书不会被续期,要自己换。公网证书的最长有效期由 CA/浏览器论坛规定,2026 年 3 月 15 日起是 200 天,2027 年 3 月 15 日起 100 天,2029 年 3 月 15 日起 47 天,ACM 续期会越来越频繁,但只要 CNAME 在就是全自动的。中国区 CloudFront 用的 IAM 证书同样不会自动续期,必须自己按时替换。建议把域名加到 ssl.sh 监控(开发中) 作为外部检查,长期规划见 为 47 天证书做准备。

常见问题排查

  • 状态一直是 PENDING_VALIDATION:CNAME 没加,或者主机记录里多拼了一次主域名,对照 describe-certificate 的输出检查。
  • CAA_ERROR 或验证失败:CAA 记录没有允许 Amazon,见 CAA 记录阻止签发。
  • 创建监听器时找不到证书:证书申请在了别的区域,或者在全球区域申请的证书想用在中国区。
  • 中国区 ALB 配好了但外部访问不通:80/443 端口尚未开放,先确认 ICP 备案已完成。
  • 浏览器提示域名不匹配:证书里没有这个域名,或者 DNS 指向了别的负载均衡器,见 NET::ERR_CERT_COMMON_NAME_INVALID。
  • 老客户端握手失败:TLS 1.3/1.2 策略或 ECDSA 密钥不兼容,见 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。

常见问题

ACM 证书一直是“等待验证”(Pending validation)?

ACM 找不到验证用的 CNAME。对照 describe-certificate 输出检查记录名和记录值;很多 DNS 服务商(包括国内的云解析、DNSPod)会自动在主机记录后面拼上主域名,把完整域名填进去就会变成 xxx.example.com.example.com。另外检查 CAA 记录是否允许 Amazon。

ACM 证书能直接装在 EC2 上吗?

标准的 ACM 公有证书不行,私钥不能导出。可以在负载均衡器上终止 TLS,或者申请付费的可导出 ACM 证书,或者在 EC2 上跑 Certbot、acme.sh 等 ACME 客户端。

同一个 ALB 怎么再加一个域名?

再申请一张 ACM 证书,用 aws elbv2 add-listener-certificates 加到 HTTPS 监听器上,ALB 会按 SNI 选择证书。监听器上保留一张默认证书。

中国区和全球区域的账户、证书能通用吗?

不能。中国区需要单独注册亚马逊云科技中国区账户,凭证和全球账户分开;证书也按区域管理,全球区域的 ACM 证书不能用在北京或宁夏区域的 ALB 上,要在中国区重新申请。

资料来源

  1. AWS Certificate Manager: DNS validation
  2. AWS Certificate Manager: Managed certificate renewal
  3. Elastic Load Balancing: Create an HTTPS listener
  4. Elastic Load Balancing: Security policies
  5. Amazon Web Services in China
  6. AWS China Regions: AWS Certificate Manager
  7. AWS China Regions: Amazon CloudFront
  8. AWS China Regions: ARNs
  9. Amazon Web Services China: ICP Recordal