ALB 证书链断裂导致 curl 报 unable to get local issuer certificate
ALB 证书链断裂导致 curl 报 unable to get local issuer certificate
在内网 ALB 上配置 HTTPS 后,客户端访问域名时报 curl: (60) SSL certificate problem: unable to get local issuer certificate。这个错误不一定是网络问题,更常见的是 ALB 绑定的 ACM 证书链不完整,或者证书 SAN 没覆盖访问域名。
现象
访问内网服务时报错:
curl https://service.example.internal/api/v1/healthcurl: (60) SSL certificate problem: unable to get local issuer certificate架构大致是:
客户端 -> 内网 ALB 443 -> 后端目标 443如果绕过 ALB,直接访问后端目标可以成功,就说明后端服务本身大概率不是根因。
排查思路
1. 不要用公网 SSL 检查结果下结论
如果域名在 Route 53 私有托管区里解析到内网 ALB,公网 SSL checker 看到的可能是另一条公网解析记录。公网检查结果无法代表内网 ALB 实际下发的证书。
2. 用 openssl 看 ALB 实际证书
在内网客户端执行:
openssl s_client -showcerts \
-connect <alb-dns-name>:443 \
-servername service.example.internal </dev/null重点看两件事:
- 证书 SAN/CN 是否覆盖访问域名。
- ALB 下发的中间证书是否和站点证书签发链匹配。
3. 区分两个问题
证书链断裂和域名不匹配是两个不同问题:
- 链断裂会导致客户端找不到可信上级 CA。
- SAN 不覆盖域名会导致主机名校验失败。
两者任何一个存在,HTTPS 都可能失败。
根因
案例中站点证书由某个 DV 中间 CA 签发,但导入 ACM 时附带的是另一个 OV 中间 CA。ALB 因此向客户端下发了不匹配的中间证书链,curl 无法构建完整信任链。
同时,ALB 绑定证书的 SAN 也没有覆盖实际访问域名。也就是说,即使证书链修好,仍然会因为域名不匹配继续失败。
解决方案
1. 修正 ACM 证书链
重新导入原 ACM 证书,上传正确的中间证书链:
aws acm import-certificate \
--certificate-arn <certificate-arn> \
--certificate fileb://site.crt \
--private-key fileb://site.key \
--certificate-chain fileb://correct-chain.crt使用 reimport 的好处是保留原 ARN,ALB 侦听器不需要重新选择证书。
2. 确保证书覆盖访问域名
检查证书 SAN 是否包含实际使用的域名:
openssl x509 -in site.crt -noout -text | grep -A1 "Subject Alternative Name"如果不包含,需要申请或导入一张覆盖目标域名的新证书,并绑定到 ALB HTTPS 侦听器。
3. 清理 ALB 侦听器证书
如果 ALB 上挂了多张证书,建议清理不再使用的证书,避免 SNI 匹配和运维判断混乱。
总结
ALB HTTPS 报 unable to get local issuer certificate 时,排查重点是 ALB 实际下发的证书链,而不是后端 Nginx 或公网 SSL 检查结果。
推荐固定排查顺序:
- 在内网用
openssl s_client -showcerts看 ALB 下发证书。 - 检查 SAN/CN 是否覆盖访问域名。
- 检查中间证书是否与站点证书签发链匹配。
- 用 ACM reimport 修正证书链,必要时更换侦听器证书。
