对 AWS Elastic Beanstalk 的 HTTPS 请求返回 net::ERR_CERT_COMMON_NAME_INVALID

Posted

技术标签:

【中文标题】对 AWS Elastic Beanstalk 的 HTTPS 请求返回 net::ERR_CERT_COMMON_NAME_INVALID【英文标题】:HTTPS Request to AWS Elastic Beanstalk returns net::ERR_CERT_COMMON_NAME_INVALID 【发布时间】:2021-09-18 07:08:26 【问题描述】:

上下文

域设置:

我在Porkbun注册了一个域名my-site.com。 我使用 CloudFlare 配置了 DNS 服务器。 我有一个来自 AWS Certificate Manager 的 SSL 证书,用于 my-site.com, www.my-site.com, and api.my-site.com。 我将 SSL 证书的每条 CNAME 记录(对于 my-site.com、www.my-site.com 和 api.my-site.com)都放入了我的 DNS 配置中。

通过此设置,my-site.com 正在尝试向我的 Flask 应用程序发送一个 HTTPS POST 请求,这是我的应用程序的 API,托管在 AWS Elastic Beanstalk 上。

Elastic Beanstalk 设置:

我向我的 EB 环境的 EC2 安全组添加了入站规则:

端口 80 和 0.0.0.0/0 上的 HTTP 请求 端口 443 和 0.0.0.0/0 上的 HTTPS 请求。

我在我的 EB 环境的经典负载均衡器中添加了侦听器:

监听器 #1) 协议:HTTP,端口:80,实例协议:HTTP,实例端口:80。 Listener #2) 协议:HTTPS,端口:443,实例协议:HTTP,实例端口:80,SSL 证书:我使用 ACM 创建的证书。

环境的 URL:my-site-env.xxx-xxxxxx.us-west-1.elasticbeanstalk.com/

我想做什么

my-site.com,我正在尝试向我的 API 路由发送 HTTPS POST 请求:my-site-env.xxx-xxxxxx.us-west-1.elasticbeanstalk.com/api/register

const config = 
  headers: 
    'Content-Type': 'application/json',
  ,
;

const body = JSON.stringify( username, email, password );

const res = await axios.post(
  'https://my-site-env.x-xxxxxx.us-west-1.elasticbeanstalk.com/api/register',
  body,
  config
);

问题

my-site.com 尝试执行 POST 请求时,我收到此错误:

POST https://reddalerts-env.eba-my6f6vhk.us-west-1.elasticbeanstalk.com/api/register 
net::ERR_CERT_COMMON_NAME_INVALID

我相信我配置了 Elastic Beanstalk 的传入流量规则以及侦听器以接收 HTTPS 请求。我是否缺少 DNS 设置的配置?

【问题讨论】:

如果您有自己的域,则不应使用xxx-xxxxxx.us-west-1.elasticbeanstalk.com。你为什么用它? 我认为域只能向其 SSL 证书上列出的域发出 HTTP/HTTPS 请求是否正确?还是域只能向同一 DNS 服务器中列出的域发出 HTTP/HTTPS 请求?我试图了解为什么域不能向 SSL 证书上列出的域之外的域发出请求。我认为 SSL 证书适用于“接收端”(例如 Elastic Beanstalk 只能接受来自证书上域的请求),但似乎 SSL 证书适用于“发送方”(例如,我的域只能将请求发送到证书)。 【参考方案1】:

如果您使用 SSL 在您的 EB 平台上设置您自己的域,您现在只能使用您的域(除非您强制例外并允许不安全的连接)。原因是您的 SSL 证书仅对已注册的域有效。

这意味着如果您在 EB 上使用 https 连接到您的网站,则只能使用您的域。默认 EB 域将导致您收到错误,因为您的 SSL 证书不涵盖 EB 默认域。

附带说明,您无法注册 EB 默认域的有效 SSL 证书,因为该域属于 AWS,AWS 必须这样做。要注册有效的 SSL 证书,您必须拥有或管理您想要证书的域。

【讨论】:

仅供我个人理解,如有错误请指正。由于我将 EB 环境设置为使用我的 SSL 证书侦听 HTTPS,因此我的 EB 环境预计只接收来自 SSL 证书上的域的请求。这意味着我的客户必须使用 SSL 证书上的域向 EB 发出请求,而不是向 EB 本身发出请求,因为 EB 本身不在 SSL 证书上。这是正确的吗? @boxcarcoder 是的,但仍然可以使用 EB 域发出 https 请求,但您会收到有关错误 ssl 的错误。任何普通浏览器都会阻止它。但是您可以例外,并允许在浏览器、curl 或任何 https 客户端中进行不安全的连接。【参考方案2】:

感谢@Marcin 澄清了我的误解。我会把我为解决我的问题所做的具体放在他的回答之上。

即使请求来自我的域 my-site.com,该域已使用我的 SSL 证书注册,我的 HTTP/HTTPS 请求仍向 xxx-xxxxxx.us-west-1.elasticbeanstalk.com 发出请求。

由于我将我的 EB 环境配置为使用 SSL 证书进行侦听,因此它只能接受来自使用我的 SSL 证书注册的域的请求。因此,我对 xxx-xxxxxx.us-west-1.elasticbeanstalk.com 的 HTTP/HTTPS 请求将不起作用。由于我的 EB 环境只接受来自使用我的 SSL 证书注册的域的请求,因此我们必须使用 DNS 服务器和 CNAME 记录。

为了实现这一点,我在我的 DNS 服务器中创建了一条 CNAME 记录,该记录将请求发送到 api.my-site.com(在我的 SSL 证书中),并将请求重定向到我的 Elastic Beanstalk 环境xxx-xxxxxx.us-west-1.elasticbeanstalk.com

然后我的 HTTP/HTTPS 请求发送到 api.my-site.com,而不是 xxx-xxxxxx.us-west-1.elasticbeanstalk.com,例如:

const res = await axios.post(
  'https://api.reddalerts.com/api/login',
  body,
  config
);

现在 HTTP/HTTPS 请求是针对使用我的 EB 环境使用的 SSL 证书注册的域发出的,它已成功完成。

【讨论】:

以上是关于对 AWS Elastic Beanstalk 的 HTTPS 请求返回 net::ERR_CERT_COMMON_NAME_INVALID的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk HTTPS

Angular Universal - 部署到 AWS Elastic Beanstalk

如何让 AWS S3 存储桶中的 Angular 应用程序对 AWS Elastic Beanstalk 中的服务进行 API 调用

AWS Elastic Beanstalk - 多容器 Docker

AWS Elastic Beanstalk 错误 - 乘客

AWS Elastic Beanstalk HTTPS