这对我来说是一个特别的问题,因为我的ASP.NET MVC项目需要使用各种OAuth提供程序。基本上任何应该使用https的内容在Elastic Beanstalk下都会出现错误。我试着通过查找X-Forwarded-Proto HTTP头来绕过它,但是很棘手。所以我真的想要SSL直通我的EC2实例。
我之前尝试了自定义AMI方法,虽然它可以工作,但存在两个问题:
- 我必须修补和维护自己的AMI,这需要耗费时间。如果我使用标准镜像,只需在可用的新镜像时重新构建环境即可。
- 我无法将配置设置源控制 - 它们只是嵌入在云中某个不透明的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 ( -not(Get-WebBinding "Default Web Site" -Port 443) ) {
$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
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中。
为了使其完整运作,您还需要:
- 配置负载均衡器以将443流量转发到EC2实例上的443端口-默认情况下切换到80端口。
- 配置负载平衡器之外的安全组以允许443流量。
- 配置EC2实例内的安全组以允许443流量。