带有负载均衡器和证书管理器的 EC2 实例上的 WSS 套接字

WSS Socket on EC2 instance with Load Balancer and Certificate Manager

我正在尝试设置一个解决方案,其中包括一个带有 Apache 运行 NodeJS 的 EC2 实例。我已经成功创建了一个工作的网络服务器实例,其中包含来自证书管理器的 public SSL 证书,可在端口 80 和 443 上访问。该服务器应该能够连接到我的其他实例,但出于某种原因我保留 运行 进入死胡同,我怀疑解决方案是不可能的...

我已经使用 Let's Encrypt 证书构建了一个工作设置,但我希望尽可能多地保留在 AWS 中。

问题: 在 LE 解决方案中,我可以访问服务器上的本地 .pem 文件。我可以像这样在服务器设置文件中包含 LE 证书的本地路径:

...

var options = {
    key: fs.readFileSync("/etc/letsencrypt/live/example.com/privkey.pem"),
    cert: fs.readFileSync("/etc/letsencrypt/live/example.com/fullchain.pem")
};

var https   = require('https').Server(options, app);

...

但是当我使用 AWS Certificate Manager 的 public 证书时,我不确定如何解决这个问题?

我的解决方案(无效): 我不是 SSL 向导,所以我可能会尝试在这里做一些不可能的事情。我已尝试使用 OpenSSL 创建本地证书,但将负载均衡器和证书管理器证书保留在域中。

...

var options = {
    key: fs.readFileSync("/home/ec2-user/server-key.pem"),
    cert: fs.readFileSync("/home/ec2-user/server-cert.pem"),
};

var https   = require('https').Server(options, app);

...

此解决方案 returns 当我尝试使用 url 连接到 node/socket 服务器时出现以下错误消息:https://live.example.com:3000:

WebSocket connection to 'wss://live.example.com:3000/socket.io/?EIO=4&transport=websocket' failed: Error in connection establishment: net::ERR_CERT_COMMON_NAME_INVALID

所以我想我的解决方案不可能同时使用域上的 Certificate Manager 证书和服务器上的 OpenSSL 证书,或者是否可以在其他地方找到问题?

请告诉我:-)

如评论中所述,通过 AWS Certificate Manager 创建的证书只能用于 certain AWS services,例如 Elastic Load Balancer,不能用于自我管理的 Web 服务器。您可以做的是使用证书管理器证书并将其放在负载均衡器上,您的 Apache/Node 服务器位于目标组中的负载均衡器后面。 public 互联网上的所有连接都是 HTTPS,但负载均衡器和您的应用程序服务器之间的连接(通过 AWS 的内部网络)将是纯 HTTP。