为 AWS 弹性 IP 获取 letsEncrypt CA 证书

Getting a letsEncrypt CA certificate for AWS Elastic IP

指南: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-2.html

问题:

我必须在 exact-online 和其他网站之间进行整合。为此,我在 Amazon linux 2 EC2 服务器上有一个 java-backend 运行,它有一个控制器方法来监听一个精确的在线 webhook。我从 webhook 获取信息并使用他们的 api 将其发送到其他网站。 所以我没有任何人可以访问的实际网页,它只是一个 'internal' 程序。

现在,对于 webhook,我的控制器如下所示:

    @RequestMapping(value = "/WebHook", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<?> webhook(@RequestBody(required = false) ExactWebHookResponse exactWebHookResponse) {
        // handle exactWebHookResponse
        return new ResponseEntity<Object>(HttpStatus.OK);
    }

webhook 仅通过 'https'-协议进行通信。所以我的控制器应该监听对 https://{Elastic-IP}/WebHook 的 webhook 请求。

按照上述指南在 Amazon 服务器上初始化 SSL/TLS;我安装了 Apache,配置了我的安全组等。一切正常,直到我尝试使用 LetsEncrypt-Certbot 获取 CA 证书。当我尝试获取域的证书时:{Elastic-IP} 它告诉我他们不向 IP 地址提供证书。所以我尝试使用我的 public DNS:ec2-{Elastic-IP}.us-east-2.compute.amazonaws.com,但他们不向 'amazonaws.com' 域提供证书。

我对SSL/TLS和证书一点都不熟悉,所以我做错了什么?

SSL/TLS 证书有两个用途——提供用于协商加密的签名 public 密钥只是其中之一。另一个是证明服务器身份或控制权——您所连接的服务器不是冒名顶替者。

浏览器、curl 和 HTTP 客户端库信任您的证书,因为它是由受信任的证书颁发机构加密签名的。

证书颁发机构在颁发证书时,实质上是在为您和您的服务器担保 -- 他们在颁发证书之前确认了您请求证书的授权。如果他们为 *.amazonaws.com 或 AWS IP 地址颁发了证书,那将等于他们断言他们相信并确认您是亚马逊……但您不是。

所以 Let's Encrypt 不会为任何明显不属于您的东西提供证书。 IP 地址不是您的,*.amazonaws.com 中的主机名也不是您的。 Amazon 有一个免费的证书产品(Amazon Certificate Manager),他们也不会为这些情况提供证书。

如果您想要 Let's Encrypt(或 ACM 或任何其他免费或非免费证书颁发机构)的证书,则需要一个域名。服务不被人类访问的事实并不真正相关。注册一个新域或从您已经拥有的域分配一个主机名。在 DNS 中将其指向您的服务,您将能够获得证书。

当然,如果服务完全在单个组织内部,您可以为任何您喜欢的东西设置私有证书颁发机构——无论是 IP 地址还是主机名——并且在这种情况下不需要外部验证因为除了您组织中选择信任您的私有 CA 的机器之外,没有人会信任您的证书。但是设置私有 CA 并非易事。