为什么在调用 API Gateway 自定义域名时返回了错误的证书?

上次更新日期:2023 年 1 月 19 日

我尝试向 Amazon API Gateway 自定义域名发送 API 请求,但返回了错误的证书。如何解决此问题?

简短描述

您可以为 API Gateway API 创建两种类型的自定义域名:区域或(仅适用于 REST API)边缘优化

对于区域自定义域名,API Gateway 会创建一个区域域名。您必须设置 DNS 记录才能将自定义域名映射到类似于“d-example.execute-api.<region>.amazonaws.com”的主机。

对于边缘优化的自定义域名,API Gateway 会创建一个 Amazon CloudFront 分配。您必须设置 DNS 记录才能将自定义域名映射到类似于“distribution-id.cloudfront.net”的 CloudFront 分配名称。

在以下场景中,SSL 证书 *.example.com 或 www.example.com 已上传到自定义域名 www.example.com。向 www.example.com 发送的 API 请求返回了类似于以下内容的错误:

来自浏览器:

“此服务器无法证明其是 www.example.com;其安全证书来自 *.execute-api.us-east-1.amazonaws.com。这可能是由于配置错误或攻击者拦截了您的连接造成的。”

来自 curl:

“curl:(60)SSL:没有其他证书使用者名称与目标主机“www.example.com”匹配。curl 未能验证服务器的合法性,因此无法与之建立安全连接。要了解有关此错误以及如何解决此错误的更多信息,请访问上述网页。”

解决方案

确保自定义域名的 CNAME 或 A 记录指向 API Gateway 域名,而不是 API Gateway 阶段 URL。

1.    运行以下 openssl 命令以验证 SSL 证书是否由自定义域返回:

openssl s_client -connect www.example.com:443 -servername www.example.com

输出示例:

subject=/CN=*.execute-api.us-east-1.amazonaws.com

2.    在自定义域上运行以下 dig 命令:

dig www.example.com

dig 命令输出包括一条指向 API Gateway 阶段 URL 的 CNAME 记录,或一条指向 IP 地址的 A 记录。

3.    通过您的域名注册商检查 www.example.com 域的 DNS 记录,以确定该域指向何处。如果您的域在 Amazon Route 53 上注册,请参阅检查来自 Route 53 的 DNS 响应

4.    要确认是否已正确映射 DNS 记录,请打开 API Gateway 控制台。在导航窗格中,选择 Custom domain names(自定义域名),然后选择您的自定义域。

5.    在 Domain details(域详细信息)中,选择 Configuration(配置),然后检查 API Gateway domain name(API Gateway 域名)。自定义域名必须映射到 API Gateway 域名。区域自定义域名使用类似于“d-example.execute-api.<region>.amazonaws.com”的前缀。边缘优化的自定义域名使用类似于“distribution-id.cloudfront.net”的前缀。

6.    如果 CNAME 记录指向 API Gateway 阶段 URL,而不是 API Gateway 域名,请更新 CNAME 记录。更改 CNAME 记录以指向您的 API Gateway 域名,而不是阶段 URL。如果您的自定义域名在第三方注册,请联系您的域名注册商。如果您的自定义域名在 Route 53 上注册,请参阅编辑记录

7.    如果您在 Amazon Virtual Private Cloud(Amazon VPC)端点中调用了 API,请检查自定义域名的 CNAME 或 A 记录映射。如果私有 DNS 已开启,则 API 请求返回 4xx 错误。由于 API 请求通过 VPC 端点路由并映射到 CNAME 或 A 记录,因此请求失败。