我一直没有写这个问题,因为我不确定它是否属于 ServerFault 或 StackOverflow。
我有一个 React Web 应用程序托管在 AWS S3 存储桶中并使用 CloudFront。我有一个 REST API,以 Java Spring Boot 应用程序的形式编写,运行在 AWS EC2 实例上。我试图在这两个实例上启用 SSL 来保护我的流量。
到目前为止,我已经使用 AWS 生成的 SSL 证书来保护 Web 应用程序。我尝试使用相同的 AWS 生成的 SSL 证书来保护 Java Spring Boot 应用程序,但我了解到使用此证书无法做到这一点。应用程序启动时,所有让 Java Spring Boot 应用程序使用此证书支持 SSL 的尝试都失败了。
我一直在本地尝试使用自签名证书,在接受浏览器警告后,该证书适用于 Web 应用程序,但不适用于 Java Spring Boot 应用程序。Java Spring Boot 应用程序启动正常,我可以使用 Postman 访问 API(在配置 Postman 以跳过证书验证后)。我相信我用来调用 Java Spring Boot 应用程序的 JavaScript 库(Axios)无法处理自签名证书,而且我无法将其配置为接受/忽略自签名证书。最终我不会使用自签名证书,所以无论如何这都是一条死路。
我在 EC2 实例上使用 HTTP API 部署托管在 S3 中的 Web 应用程序似乎并不奇怪。是吗?我应该以不同的方式做吗?
在我进一步深入研究购买证书和使用更多 AWS 服务之前,我希望这里有人可以给我一些指导。
答案1
首先,我不认为 AWS 会对应用于其基础设施的证书收费。我会在 CloudFront 和 EC2 实例之间放置一个负载均衡器,并在负载均衡器上使用证书,并在负载均衡器和 EC2 实例之间使用未加密的流量。希望这能解决您的应用程序问题。您可以使用安全规则将实例仅锁定到负载均衡器。
有几种方法可以将负载均衡器锁定到 CloudFront - 一种常见的方法是放置一个小型且不经常运行的 Lambda 函数,以将访问限制为仅对 CloudFront IP 地址进行访问,如记录所示这里。
我还让 CloudFront 添加一个自定义标头,并以魔术字符串作为其值,并让 EC2 上的 apache 过滤掉没有魔术字符串的任何流量。这两项措施似乎完全有效地阻止了非云端对服务器的访问,您可以将进一步的 WAF 措施集中在 CloudFront 分发本身上。