AWS弹性负载均衡器能否将端口443转发到弹性Beanstalk实例的端口443?

3
我有一个带有SSL证书设置在负载均衡器上的Windows/.NET弹性Beanstalk实例。默认情况下,这会创建从https/443到http/80的端口转发。我想要将负载均衡器上的443/https转发到Beanstalk实例上的443 https。我试图按照这里所述进行操作:
我重新配置了相应的EC2实例EC2->负载均衡器->监听器,使HTTPS转发到使用我的SSL证书配置的HTTPS,但问题是当我尝试进行HTTPS请求时,它只是超时。似乎ElasticBeanstalk实例不喜欢我修改EC2监听器。你有什么想法吗?
3个回答

2
为了使负载均衡器和弹性 Beanstalk 之间的 SSL 正常工作,我需要做以下几件事情:
  1. 配置 EC2 负载均衡器将端口 443 转发到 SSL 上的端口 443。我已经在上面的问题中完成了这一部分。
  2. 像任何其他启用 SSL 的站点一样配置 EC2 实例上的 IIS: a) 在 IIS 中安装 EC2 实例上的 SSL 证书。 b) 添加带有 SSL 证书的 https/443 绑定。
问题在于我本来期望 #2 是免费的。在 Windows Azure 上,当您在实例上配置证书时,这基本上是免费的,但是目前在 AMZN ElasticBeanstalk for windows 上并非如此。
我还期望 #2 是可脚本化的,这样我就可以在不必手动执行 #2 的情况下缩放实例。我正在寻找一些简单的方法来在我的 EB 实例上连接 PowerShell 脚本,但似乎它们也没有这个功能。
我的最终解决方案是创建一个自定义 VM 映像 (AMI),其中已安装了 SSL 证书并已添加了 https 绑定。如果我这样做,我可以使用我已经设置好 SSL 的 ElasticBeanstalk 映像进行部署。这样做后,我就可以在不进行任何配置的情况下进行缩放。

1
这对我来说是一个特别的问题,因为我的ASP.NET MVC项目需要使用各种OAuth提供程序。基本上任何应该使用https的内容在Elastic Beanstalk下都会出现错误。我试着通过查找X-Forwarded-Proto HTTP头来绕过它,但是很棘手。所以我真的想要SSL直通我的EC2实例。

我之前尝试了自定义AMI方法,虽然它可以工作,但存在两个问题:

  1. 我必须修补和维护自己的AMI,这需要耗费时间。如果我使用标准镜像,只需在可用的新镜像时重新构建环境即可。
  2. 我无法将配置设置源控制 - 它们只是嵌入在云中某个不透明的AMI中。

我从this post中进行了修改。

首先,您需要在Visual Studio Web项目的根目录下添加一个名为:.ebextensions的目录。

在其中创建一个名为environment.config的文本文件 - 我们将在这里使用YAML,因此请勿在Visual Studio中进行编辑,以防它认为它是应用程序配置文件并添加制表符 - YAML对空格很敏感。有关该文件的语法,请参见Amazon网站
我的文件有一堆其他用于调整IIS的设置,但相关部分看起来像这样:
container_commands:
  site_add_ssl_binding:
    command: PowerShell -ExecutionPolicy Bypass -File "C:\\inetpub\\wwwroot\\.ebextensions\\ssl.ps1"

这将执行一个名为ssl.ps1的自定义PowerShell脚本。因此,让我们在.ebextensions目录中创建它:

# If there is no existing SSL binding
if ( -not(Get-WebBinding "Default Web Site" -Port 443) ) {

    # Import the .pfx file into the certificate store
    $securepwd = ConvertTo-SecureString -String "YOUR_PFX_PASSWORD_HERE" -Force -AsPlainText
    $cert = Import-PfxCertificate -FilePath C:\inetpub\wwwroot\.ebextensions\my-certificate.pfx cert:\localMachine\my -Password $securepwd

    # Create site binding in IIS
    New-WebBinding -Name "Default Web Site" -IP "*" -Port 443 -Protocol https
    New-Item IIS:SslBindings\0.0.0.0!443 -value $cert
}

执行此命令后,将会导入一个 .pfx 文件到证书存储中,并在您的网站的 443 端口上创建 SSL 绑定。
我参考了原始代码后遇到了各种字符编码问题。因此,如果您复制/粘贴此示例代码并且不起作用,可以通过远程连接到 EC2 实例,在命令提示符中直接执行以下命令进行测试:PowerShell -ExecutionPolicy Bypass -File "C:\inetpub\wwwroot\.ebextensions\ssl.ps1" 您还需要将您的 .pfx 文件添加到 .ebextensions 目录中。在 Visual Studio 中,请确保所有文件都包含在项目中,并具有内容生成操作(提示:在“解决方案资源管理器”中选择文件,然后按 F4)。解决方案资源管理器应如下所示:
  • web-project.csproj
    • .ebextensions
      • environment.config
      • my-certificate.pfx
      • ssl.ps1
  • ...
然后使用 AWS Toolkit for Visual Studio,右键单击项目并选择Publish to AWS,然后按照提示操作。这将上传您的部署包到Elastic Beanstalk环境,并安装它。您的自定义内容将在部署期间或每当新的EC2实例被配置时执行。
成功执行后,.ebextensions目录将被删除。
如果您不想在Visual Studio项目中包含.pfx文件,则原始示例使用PowerShell从S3实例下载.pfx文件。您还可以通过引用Elastic Beanstalk环境变量来避免将密码嵌入.ps1中。
为了使其完整运作,您还需要:
  1. 配置负载均衡器以将443流量转发到EC2实例上的443端口-默认情况下切换到80端口。
  2. 配置负载平衡器之外的安全组以允许443流量。
  3. 配置EC2实例内的安全组以允许443流量。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接