在CDN架构中,SSL终止(SSL Termination)指的是HTTPS连接的加解密过程在离用户最近的边缘节点完成,而不是一路加密回源站。AWS CloudFront默认对每个分配(Distribution)的默认域名提供免费证书,但一旦业务需要绑定自己的多个域名,比如www.example.cn、api.example.cn和m.example.cn同时走同一个分发节点,就涉及SNI技术、ACM证书以及备用域名的联动配置。这篇文章详细拆解CloudFront如何基于SNI实现单张证书服务多域名,以及在边缘完成SSL终止的完整链路。

一、SNI的工作原理与CloudFront的支持方式
SNI全称是Server Name Indication,它是TLS协议的一个扩展字段,位于客户端发起握手时的ClientHello消息中。TLS握手本身发生在HTTP层之前,服务器无法从请求的Host头判断客户端要访问哪个域名,于是SNI的作用就是在握手阶段就把目标域名告诉服务器,让服务器据此挑选出正确的证书返回。
CloudFront作为共享型边缘服务,全球有海量的域名解析到同一批边缘IP上。当客户端发起TLS握手时,边缘节点会读取SNI字段,检查该域名是否匹配某个已配置的CloudFront分配,然后取出对应的证书完成握手。这就是为什么CloudFront要求绑定自定义域名时,客户端必须支持SNI——不支持SNI的老旧客户端(如Windows XP上的IE6)将无法正确握手。对绝大多数现代浏览器和HTTP客户端来说,SNI早已是标配,所以这个限制在如今基本可以忽略。
在分配的SSL证书设置中,CloudFront提供两种模式:默认的CloudFront证书只覆盖系统分配的域名,例如d111111abcdef8.cloudfront.net;而自定义SSL证书模式则允许你绑定自己在ACM申请的证书,从而支持自己的域名。SNI模式是免费的,专用IP模式则需要为每个分配的每个边缘区域付费,成本高出许多,除非确实有大量不支持SNI的客户端,否则一律建议选择SNI。
二、多域名SAN证书的申请与配置流程
要让一张证书覆盖多个域名,需要在AWS Certificate Manager(简称ACM)中申请包含多个SAN(Subject Alternative Name)的证书。关键点在于:CloudFront使用的证书必须申请或导入到美国东部(弗吉尼亚北部)区域,也就是us-east-1,这是CloudFront的全局服务特性决定的,其他区域的ACM证书在CloudFront控制台中无法选择。
申请时以www.ipipp.com为主域名,额外添加api.ipipp.com和m.ipipp.com作为SAN条目,通过DNS验证方式完成所有权证明后,证书状态变为Issued即可使用。如果域名不在Route 53托管,也可以导出CNAME验证记录到任意DNS服务商。申请完成后,进入CloudFront分配的编辑页面,在SSL Certificate选项中选择Custom SSL Certificate,下拉列表里就会出现这张多域名证书。
接下来配置备用域名(Alternate Domain Name,也就是CNAME)。每个要使用的域名都必须填写到备用域名列表中,并且必须与证书中的SAN条目一一对应。这里有一个容易踩的坑:如果证书里包含通配符域名如*.ipipp.com,CloudFront要求你填写的具体子域名必须落在通配符覆盖范围内,且通配符只匹配一级子域名。配置完成后,还需要在DNS侧把www.ipipp.com等域名的CNAME记录指向分配的默认域名,等待解析生效。
# 使用AWS CLI在美国东部区域申请多域名证书
aws acm request-certificate \
--domain-name www.ipipp.com \
--subject-alternative-names api.ipipp.com m.ipipp.com \
--validation-method DNS \
--region us-east-1
# 查询验证记录并添加到DNS后,等待证书签发
aws acm describe-certificate \
--certificate-arn arn:aws:acm:us-east-1:123456789012:certificate/xxxx \
--region us-east-1证书与备用域名的校验是自动进行的。如果CloudFront检测到你填写的备用域名没有出现在证书的SAN列表里,保存时会直接报错,提示CNAME does not match certificate。这种强校验机制保证了边缘节点在SNI握手时一定能拿到匹配的证书,避免了证书与域名不一致导致的浏览器告警。
三、边缘SSL终止后的回源策略与协议选择
SSL终止在边缘意味着客户端到CloudFront这一段是加密的,而CloudFront到源站这一段可以灵活选择。分配设置中的Origin Protocol Policy有三个选项:HTTP Only表示回源走80端口的明文,HTTPS Only强制回源走443加密,Match Viewer则让回源协议跟随客户端请求协议。
对于内网源站或者源站在ALB后面且有安全组隔离的场景,HTTP Only回源可以减少源站的TLS开销;而对安全要求严格的金融、账号类业务,建议使用HTTPS Only,保证端到端加密。Match Viewer要谨慎使用:当客户端用HTTPS访问而源站不支持443时会直接报502错误,而且明文与加密混用也容易带来合规问题。
在Viewer Protocol Policy上,可以设置Redirect HTTP to HTTPS,让所有HTTP请求被301重定向到HTTPS,配合边缘的HSTS响应头(通过响应策略Response Headers Policy下发)可以有效防止协议降级。此外,自定义SSL客户端协议建议至少启用TLSv1.2,禁用老旧的SSLv3和TLSv1.0,CloudFront的安全策略选项中可以选择仅保留TLSv1.2及以上,符合当前主流的安全基线要求。
# 更新分配:启用SNI自定义证书并强制HTTPS回源
aws cloudfront update-distribution \
--id E1234ABCDEF \
--distribution-config '{
"CallerReference": "my-dist-2024",
"Origins": {
"Quantity": 1,
"Items": [{
"Id": "my-origin",
"DomainName": "origin.ipipp.com",
"CustomOriginConfig": {
"OriginProtocolPolicy": "https-only",
"OriginSSLProtocols": { "Quantity": 1, "Items": ["TLSv1.2"] },
"OriginReadTimeout": 30
}
}]
},
"DefaultCacheBehavior": {
"TargetOriginId": "my-origin",
"ViewerProtocolPolicy": "redirect-to-https",
"AllowedMethods": { "Quantity": 2, "Items": ["GET", "HEAD"] },
"ForwardedValues": { "QueryString": false, "Cookies": { "Forward": "none" } },
"TrustedSigners": { "Enabled": false, "Quantity": 0 },
"MinTTL": 0
},
"Enabled": true,
"Comment": "multi-domain SNI distribution",
"Aliases": { "Quantity": 3, "Items": ["www.ipipp.com", "api.ipipp.com", "m.ipipp.com"] }
}'四、常见报错排查与配置校验
配置完成后如果访问异常,第一类常见问题是域名解析没生效。可以本地执行dig或nslookup确认CNAME是否已指向CloudFront的默认域名,DNS传播通常需要几分钟到几十分钟不等。
第二类问题是证书与备用域名不匹配。用openssl命令直接对边缘节点做握手测试,观察返回的证书主题,判断边缘是否返回了你预期的多域名证书:
# 指定SNI测试证书返回情况 openssl s_client -connect d111111abcdef8.cloudfront.net:443 -servername www.ipipp.com | openssl x509 -noout -subject -ext subjectAltName # 检查证书有效期 openssl s_client -connect d111111abcdef8.cloudfront.net:443 -servername api.ipipp.com 2>/dev/null | openssl x509 -noout -dates
第三类是回源失败导致的5xx错误。如果配置了HTTPS Only回源但源站证书是自签的,CloudFront默认不验证源站证书链,但仍要求TLS握手能完成,源站必须支持对应的TLS版本。遇到502时优先检查源站443端口是否可从公网访问、Origin SSL Protocols与源站实际支持的协议是否一致。另外要注意ACM证书到期前会自动续期,但如果当初的DNS验证记录被删除,续期会失败,证书一旦过期,所有绑定该证书的域名都会握手报错,因此建议在ACM上配置到期提醒或在CloudWatch中监控证书过期指标。
整体来看,CloudFront加SNI加ACM多域名证书的组合,让一张证书、一个分配就能承载全部业务域名的SSL终止,既省去了在源站维护多张证书的运维成本,又借助边缘节点的全球分布降低了TLS握手的延迟,是多域名HTTPS分发场景下非常成熟的方案。
CloudFrontSNISSL证书修改时间:2026-09-04 08:04:46