在我的 ASP.NET MVC 项目中使用各种 OAuth 提供程序时,这对我来说是一个特别的问题。基本上任何应该使用 https 的东西都在 Elastic Beanstalk 下被破坏了。我尝试通过寻找 X-Forwarded-Proto HTTP 标头来围绕它进行编码,但它非常讨厌。所以我真的希望 SSL 直接连接到我的 EC2 实例。
我可能花了 3 小时才弄清楚如何在不使用 AMI 的情况下做到这一点,所以希望这对某人有所帮助。
我之前尝试过自定义 AMI 方法,虽然它有效,但它存在两个问题:
- 我必须修补和维护自己的 AMI,这非常耗时。如果我使用标准镜像,我可以在有新镜像可用时重建环境。
- 我无法对我的配置设置进行源代码控制 - 它们只是嵌入在云端某处的不透明 AMI 中。
我改编自this post。
首先,您需要在 Visual Studio Web 项目的根目录中添加一个名为:.ebextensions 的目录。
在其中创建一个名为 environment.config 的文本文件 - 我们将在此处使用 YAML,所以不要在 Visual Studio 中编辑它,以防它认为它是应用程序配置文件并添加选项卡 - YAML 对空格敏感.该文件的语法记录在on 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
- 我的证书.pfx
- ssl.ps1
- ...
然后使用AWS Toolkit for Visual Studio,右键单击您的项目并选择Publish to AWS 并按照提示进行操作。这会将您的部署包上传到您的 Elastic Beanstalk 环境并进行安装。您的自定义将在部署期间执行,或者在配置新的 EC2 实例时执行。
成功执行后,.ebextensions 目录将被删除。
如果您不想在 Visual Studio 项目中包含 .pfx 文件,original example 使用 PowerShell 从 S3 实例下载 .pfx 文件。您还可以通过引用 Elastic Beanstalk 环境变量来避免在 .ps1 中嵌入密码。
要实现端到端的工作,您还需要:
- 将您的负载均衡器配置为将 443 流量转发到 EC2 实例上的端口 443 - 默认切换到端口 80。
- 在负载平衡器之外配置安全组以允许 443 流量。
- 将安全组配置到 EC2 实例中以允许 443 流量。