0

I am setting up AWS Elastic Beanstalk application and I want the traffic to it to be HTTPS.

I created a DNS CNAME record matching the beanstalk url and created and approved a certificate for that DNS name in AWS Certificate Manager.

Now I went to Elastic Beanstalk environment --> Configuration --> Network Tier / Load Balancer (Image below) in order to set the "Secure listener port" from OFF to 443 and choose my certificate.

But my certificate is not there to choose from ! So My question is how to get my certificate or a certificate into that selection list, or is that a bug in AWS?

Elastic Beanstock Listener configuration

Note - I was able to see my certificate when going to EC2 / Load balancers and was able to change the load balancer from HTTP to HTTPS and choose my certificate there. But this did not reflect on Elastic Beanstalk load balancer configuration that still shows port 80. Using HTTPS to the beanstalk did not work this way.

Help!

4

2 回答 2

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 根目录中运行命令并且文件在同一个目录中。这篇文章详细介绍了(对我有用)。祝你好运!

请注意,尽管可以,但您不应直接通过负载均衡器控制台(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);

        }

    }

}
于 2016-04-06T11:48:20.163 回答
0

Brian FitzGerald 的回答和这个博客帮助我找到了一种简单的方法来做到这一点(在 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 编号(在右下角)。

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

于 2016-04-18T11:27:08.537 回答