我尝试向 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 记录,因此请求失败。
相关信息
我如何为我的 API Gateway API 自定义域名?
使用自定义域名调用 API Gateway API 时,如何解决证书过期或“invalid certificate”(证书无效)错误?