【问题标题】:Where does AWS Elastic Beanstalk Load Balancer look for certifications?AWS Elastic Beanstalk 负载均衡器在哪里寻找认证?
【发布时间】:2016-07-26 14:26:15
【问题描述】:

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

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

现在我转到 Elastic Beanstalk 环境 --> 配置 --> 网络层/负载均衡器(下图),以便将“安全侦听器端口”从关闭设置为 443 并选择我的证书。

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

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

救命!

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk aws-certificate-manager


    【解决方案1】:

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

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

    简而言之,您需要:

    • 创建一个 elb-acm.json 文件并将其放在您的 Web 根目录中的某个位置。我将注意力直接放在应用程序的 Web 根目录中。
    • 转到证书管理器并获取证书的 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 和裸 mydomain.com 都安全,请确保首先对其进行完全配置,因为一旦您运行这些命令,就没有简单的方法可以将您的证书与您的环境“解除关联” (如果我在这种情况下没记错的话,您基本上需要完全终止您的环境并创建一个新环境)。

    此外,您还需要在您的应用程序中添加一些重定向代码,以便在您设置好证书后对传入的任何非安全请求执行 301 重定向。要执行重定向,您需要在传入请求中查找 X-Forwarded-Proto 标头。如果它不安全,您应该重定向到安全端口。例如,我的应用程序代码如下所示:

    // 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);
    
            }
    
        }
    
    }
    

    【讨论】:

    • 为此发送。关于 aws cli - 我们是在谈论 'awsebcli' 还是只是 'aws' cli?我很快就会去检查那个程序。与此同时,我实际上设法通过更改 EC2 > 负载均衡器来设置它,以至于你提到这将在升级时被替换。
    • 很确定它是主要的“aws”cli。我链接到 Anand Capur 的那篇文章非常好。
    【解决方案2】:

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

    使用AWS Elastic Beanstalk CLI(简称eb)的解决方案更简单。正确设置环境后,您可以使用eb config 命令。 当编辑窗口打开时,向下滚动到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 编号(在右下角)。

    我保存了配置,等待环境更新就可以了。

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2022-08-10
      • 2013-08-10
      • 2017-02-14
      相关资源
      最近更新 更多