HTTPS Elastic Beanstalk 非自定义域

Posted

技术标签:

【中文标题】HTTPS Elastic Beanstalk 非自定义域【英文标题】:HTTPS Elastic Beanstalk non custom domain 【发布时间】:2019-01-10 03:43:11 【问题描述】:

我在 Elastic Beanstalk 上部署了我的 Django 应用程序。它给了我这样的网址

http://<my-environment>.us-west-2.elasticbeanstalk.com 

有没有一种简单的方法可以使 HTTPS 具有相同的 URL 而无需购买证书?

【问题讨论】:

【参考方案1】:

我不同意接受的答案:是的,有 Amazon 批准的方法可以使用 Elastic Beanstalk 提供的默认域加载证书(免费自签名证书)。我刚刚使用最新的默认 Django 应用程序作为概念证明(Django 版本 2.1 和 Python 版本 3.6)完成了这项任务。我的部署是在一台装有最新 AWS cli 的 Windows 10 机器上完成的。

在您的应用程序的初始测试和验证阶段,您通常会执行这样的程序。为了确保可行性,而无需为您的最终域购买证书。您有一个应用程序并想查看它是否会安全地部署在 Elastic Beanstalk 上。亚马逊从accepted answers linked document推荐它:

对于开发和测试,您可以使用开源工具自己创建和签署证书。自签名证书免费且易于创建,但不能用于公共站点的前端解密。如果您尝试将自签名证书用于与客户端的 HTTPS 连接,则用户的浏览器会显示一条错误消息,指示您的网站不安全。但是,您可以使用自签名证书来保护后端连接而不会出现问题。

我在下面展示的概念验证使用了默认的 Elastic Beanstalk Python 3.6 环境,该环境在负载均衡器处终止 HTTPS。 (注意:自签名证书也可用于保护负载均衡器和实例之间的流量,但我的回答不涉及此主题)

按照以下步骤操作:

    使用命令行界面 (EB CLI) 将您的 Django 应用程序安装到 Elastic Beanstalk 中。我按照以下指南中的步骤操作:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html。在撰写本文时,我抓取的 Django 版本是 2.1,而我为 EB 选择的 Python 版本是 3.6。只需按照“更新您的应用程序”之前的步骤操作即可。记下并保存运行 eb status 后返回的 CNAME(EB 域名),因为您将在我的第 2 步中需要它。

    在您的开发机器上安装 OpenSSL。然后按照以下步骤使用 openSSL 创建自签名证书:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-ssl.html。您无需在此页面上执行最后一步。下一步将需要 server.crtprivatekey.cer 文件的内容。在这个答案的最底部是我用于证书的假值。这些都不重要,除了域名。

    在您的 AWS 控制台中转到 Certification Manager。有一个蓝色的大按钮,导入证书。点击这个。使用您喜欢的文本编辑器打开server.crt 文件,然后将内容粘贴到带有标签的顶部框中:证书正文。然后使用您喜欢的文本编辑器打开privatekey.cer 文件,并将内容粘贴到带有标签的第二个框中:证书私钥。点击 Review and Import 并确保一切正常。

    最后一步是打开 HTTPS 并在负载平衡器上终止它。按照本亚马逊指南中的步骤操作:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-elb.html。请注意,在本指南的第 5 步中,您需要按照 Classic Load Balancer 的步骤进行操作。选择您在此答案的第 3 步中上传到证书管理器的证书。

申请后 - 您的网站将使用自签名证书运行 HTTPS。请参阅下面的概念证明网站,它只是默认的 Django 应用程序:

点击证书显示详细信息:

希望这有助于您在 AWS 上验证 Django 应用程序。请不要为您的实时(也称为生产)环境运行自签名证书。

【讨论】:

【参考方案2】:

“有没有一种简单的方法来拥有相同的 URL”

简单的答案:不。

由于您不拥有域名 elasticbeanstalk.com,因此您无法分配有效的 SSL 证书。即使您自己创建了一个自签名证书,它也是不受信任的,并且浏览器会显示错误。

您只能为您“控制”的域提供有效的 SSL 证书。即证明您的所有权。因此,要使有效的 HTTPS 工作并拥有有效的证书,您需要注册一个域名。

来源: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https.html

【讨论】:

【参考方案3】:

您将需要一个证书。您可以上传自己的证书,也可以直接使用证书免费的 AWS ACM (https://docs.aws.amazon.com/acm/latest/userguide/acm-billing.html)。

    向 AWS ACM 申请证书

    将配置文件添加到具有LoadBalancer 资源的.ebextensions 目录,并将SSLCertificateId 设置为(1) 中证书的ARN:

    Resources:
    AWSEBLoadBalancer:
        Type: "AWS::ElasticLoadBalancing::LoadBalancer"
    Properties:
        Listeners: [
            "LoadBalancerPort": "443",
            "SSLCertificateId": "$CERT_ARN",
            "Protocol": "HTTPS" ]
    

【讨论】:

如何在没有域的情况下向 AWS ACM 请求证书?

以上是关于HTTPS Elastic Beanstalk 非自定义域的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk - PHP / 强制 HTTPS

无法在 Elastic Beanstalk 上部署节点:命令“/bin/sh -c npm install”返回非零代码:1

使用 Cloudflare 将 HTTPs 添加到 Elastic Beanstalk

AWS Elastic Beanstalk 中的 HTTPS 配置

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk HTTPS