对 AWS Elastic Beanstalk 的 HTTPS 请求 returns net::ERR_CERT_COMMON_NAME_INVALID
HTTPS Request to AWS Elastic Beanstalk returns net::ERR_CERT_COMMON_NAME_INVALID
上下文
域设置:
- 我在Porkbun注册了一个域名,
my-site.com
。
- 我用 CloudFlare 配置了一个 DNS 服务器。
- 我有 AWS Certificate Manager 为
my-site.com, www.my-site.com, and api.my-site.com
颁发的 SSL 证书。
- 我将 SSL 证书的每个 CNAME 记录(对于我的-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。
- 侦听器 #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 设置的配置?
如果您使用 SSL 在您的 EB 平台上设置自己的域,您现在只能使用您的域(除非您强制例外并允许不安全的连接)。原因是您的 SSL 证书仅对已注册的域有效。
这意味着如果你在EB上使用https连接到你的网站,你只能使用你的域名。默认 EB 域将导致您收到错误,因为您的 SSL 证书不涵盖 EB 默认域。
附带说明一下,您无法注册 EB 默认域的有效 SSL 证书,因为该域属于 AWS,而 AWS 必须这样做。要注册有效的 SSL 证书,您必须拥有或管理您想要证书的域。
感谢@Marcin 消除了我的误解。我会把我为解决我的问题所做的具体放在他的回答之上。
即使请求来自我的域 my-site.com
,它已使用我的 SSL 证书注册,但我的 HTTP/HTTPS 请求正在向 xxx-xxxxxx.us-west-1.elasticbeanstalk.com
.[=17= 发出请求]
由于我将我的 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 证书注册的域发出的,它已成功完成。
上下文
域设置:
- 我在Porkbun注册了一个域名,
my-site.com
。 - 我用 CloudFlare 配置了一个 DNS 服务器。
- 我有 AWS Certificate Manager 为
my-site.com, www.my-site.com, and api.my-site.com
颁发的 SSL 证书。 - 我将 SSL 证书的每个 CNAME 记录(对于我的-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。
- 侦听器 #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 设置的配置?
如果您使用 SSL 在您的 EB 平台上设置自己的域,您现在只能使用您的域(除非您强制例外并允许不安全的连接)。原因是您的 SSL 证书仅对已注册的域有效。
这意味着如果你在EB上使用https连接到你的网站,你只能使用你的域名。默认 EB 域将导致您收到错误,因为您的 SSL 证书不涵盖 EB 默认域。
附带说明一下,您无法注册 EB 默认域的有效 SSL 证书,因为该域属于 AWS,而 AWS 必须这样做。要注册有效的 SSL 证书,您必须拥有或管理您想要证书的域。
感谢@Marcin 消除了我的误解。我会把我为解决我的问题所做的具体放在他的回答之上。
即使请求来自我的域 my-site.com
,它已使用我的 SSL 证书注册,但我的 HTTP/HTTPS 请求正在向 xxx-xxxxxx.us-west-1.elasticbeanstalk.com
.[=17= 发出请求]
由于我将我的 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 证书注册的域发出的,它已成功完成。