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

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 负载均衡器在哪里寻找认证?【英文标题】:Where does AWS Elastic Beanstalk Load Balancer look for certifications? 【发布时间】: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 并不能以这种方式工作。

救命!

【问题讨论】:

【参考方案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 编号(在右下角)。

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

【讨论】:

以上是关于AWS Elastic Beanstalk 负载均衡器在哪里寻找认证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS 中为 Elastic Beanstalk 设置应用程序负载均衡器

AWS Elastic Beanstalk - 将负载均衡器追溯添加到应用程序

AWS Elastic Beanstalk 负载均衡器 SSL/HTTPS 不起作用

是否可以将负载均衡器添加到没有负载均衡器的现有 AWS Elastic Beanstalk 应用程序?

AWS Elastic Beanstalk 环境的静态 IP,带有用于 Tableau 可信身份验证的负载均衡器

无法为在 Elastic Beanstalk AWS 上运行 ASP.NET 的网站强制使用 HTTPS(使用经典负载均衡器)