AWS Elastic Beanstalk 负载均衡器在哪里寻找认证?

Where does AWS Elastic Beanstalk Load Balancer look for certifications?

我正在设置 AWS Elastic Beanstalk 应用程序,我希望它的流量为 HTTPS。

我创建了一个与 beantalk url 匹配的 DNS CNAME 记录,并在 AWS Certificate Manager 中为该 DNS 名称创建并批准了一个证书。

现在我转到 Elastic Beanstalk 环境 --> 配置 --> 网络层/负载均衡器(下图),以便将 "Secure listener port" 从 OFF 设​​置为 443 并选择我的证书。

但是我的证书没有可供选择! 所以我的问题是如何将我的证书或证书放入该选择列表,或者这是 AWS 中的错误?

注意 - 我在转到 EC2/负载均衡器时能够看到我的证书,并且能够将负载均衡器从 HTTP 更改为 HTTPS 并在那里选择我的证书。 但这并没有反映在仍然显示端口 80 的 Elastic Beanstalk 负载均衡器配置上。使用 HTTPS 到 beantalk 并不能以这种方式工作。

求助!

目前无法通过控制台将您在证书管理器中创建的证书分配给您的 Beanstalk 环境。

为此,您需要使用 AWS CLI。我能够做到这一点,幸运的是,这很容易。

简而言之,您需要:

  • 创建一个 elb-acm.json 文件并将其放置在您的网络根目录中的某个位置。我直接把 mind 放在我的应用程序的 web root 中。
  • 转到证书管理器并获取证书的 arn ID
  • 使用 update environment 命令将您的证书应用于您的环境

aws elasticbeanstalk update-environment --environment-name Your-Environment --option-settings file://PATH-TO-JSON/elb-acm.json

对我来说,路径只是 file://elb-ecm.json 因为(我相信原因是因为)我在 Web 根目录中 运行 执行命令并且文件位于同一目录中 This article goes into detail(并为我工作)。祝你好运!

请注意,尽管可以,但您不应直接通过负载均衡器控制台(EC2 > 负载均衡器)分配证书,因为每当您重建 Beanstalk 环境时,负载均衡器都会被破坏并重新创建。

此外,请确保在将证书应用到您的 Beanstalk 环境之前按照您的需要设置证书。例如,如果您希望 *.mydomain.com 和 naked mydomain.com 都安全,请确保首先完全配置,因为没有简单的方法从您的环境 "de-associate" 您的证书一次您的 运行 这些命令(如果我在这种情况下没有弄错的话,您基本上需要完全终止您的环境并创建一个新环境)。

此外,您需要在您的应用程序中加入一些重定向代码,以便在您设置好证书后对收到的任何 non-secure 请求执行 301 重定向。要执行重定向,您需要在传入请求中查找 X-Forwarded-Proto header。如果它不安全,您应该重定向到安全端口。例如,这是我的应用程序代码的样子:

// in production, only allow secure requests (https)
public function performSecureRedirect(rc) {

    // based on domain comparison
    var isLive = myEnvironmentData.isLive;

    // setting up the health check url is important for smooth beanstalk deployments
    // beanstalk issues this healthcheck request via a non-secure port
    var isAmazonHealthcheckUrl = rc.event eq "system.healthcheck";

    if (isLive and not isAmazonHealthcheckUrl) {

        var headerData = getHTTPRequestData().headers;

        // x-forwarded-proto is a special header
        // setup by Amazon ELB (Elastic Load Balancer)
        var requestProtocol = getHttpRequestData().headers['x-forwarded-proto'];
        var isSecureRequest = requestProtocol eq "https";

        if (not isSecureRequest) {

            location("https://" & cgi.server_name & cgi.path_info, false, 301);

        }

    }

}

Brian FitzGerald 和 this blog 的回答帮助我找到了一个简单的方法(在 Elastic beantalk 负载均衡器上设置 https 并为其使用 CRM 证书)。

使用AWS Elastic Beanstalk CLI(简称eb)解决方案更简单。正确设置环境后,您可以使用 eb config 命令。 当编辑 window 打开时,向下滚动到 aws:elb:loadbalancer 部分。

修改负载均衡器部分(在我的例子中我完全删除了端口 80,你可能想保留它):

  aws:elb:loadbalancer:
    CrossZone: 'true'
    LoadBalancerHTTPPort: 'OFF'
    LoadBalancerHTTPSPort: '443'
    LoadBalancerPortProtocol: HTTP
    LoadBalancerSSLPortProtocol: HTTPS
    SSLCertificateId: PLACE HERE THE CRM CERTIFICATE ARN
    SecurityGroups: '{"Fn::GetAtt":["AWSEBLoadBalancerSecurityGroup","GroupId"]},{"Ref":"AWSEBLoadBalancerSecurityGroup"}'

证书的 arn 可以在 AWS > Certificate Manager 中找到。 打开证书并复制ARN号(在右下角)。

我保存了配置,等待环境更新,就是这样。