对于我的 ASP.NET MVC 项目和各种 OAuth 提供程序,这对我来说是一个特别的问题。基本上任何应该使用 https 的东西都在 Elastic Beanstalk 下被破坏了。我尝试通过寻找 X-Forwarded-Proto HTTP 标头来围绕它进行编码,但它非常讨厌。所以我真的希望 SSL 直接连接到我的 EC2 实例。
我可能花了 3 小时才弄清楚如何在不使用 AMI 的情况下做到这一点,所以希望这对某人有所帮助。
我之前尝试过自定义 AMI 方法,虽然它有效,但它存在两个问题:
- 我必须修补和维护自己的 AMI,这很耗时。如果我使用标准图像,我可以在有更新的图像可用时重建环境。
- 我无法对我的配置设置进行源代码控制——它们只是嵌入在云中某处的不透明 AMI 中。
我从这篇文章中改编了这个。
首先,您需要在您的 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
. 所以让我们在.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)。解决方案资源管理器应如下所示:
然后使用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 流量。