目前无法通过控制台将您在证书管理器中创建的证书分配给您的 Beanstalk 环境。
为了完成此操作,您需要使用 AWS CLI。我能够做到这一点,幸运的是,这很容易。
简而言之,您需要:
- 创建一个 elb-acm.json 文件并将其放在您的 Web 根目录中的某个位置。我将注意力直接放在应用程序的 Web 根目录中。
- 转到证书管理器并获取证书的 arn ID
- 使用
update environment 命令将您的证书应用到您的环境中
aws elasticbeanstalk update-environment --environment-name Your-Environment --option-settings file://PATH-TO-JSON/elb-acm.json
对我来说,路径只是 file://elb-ecm.json,因为(我相信原因是因为)我在 Web 根目录中运行命令,并且文件位于同一目录中 This article goes into detail(并且为我工作)。祝你好运!
请注意,尽管可以,但您不应直接通过负载均衡器控制台(EC2 > 负载均衡器)分配证书,因为每当您重建 Beanstalk 环境时,负载均衡器都会被炸毁并重新创建。
另外,在将证书应用到 Beanstalk 环境之前,请确保您已按照自己的意愿设置了证书。例如,如果您希望 *.mydomain.com 和裸 mydomain.com 都安全,请确保首先对其进行完全配置,因为一旦您运行这些命令,就没有简单的方法可以将您的证书与您的环境“解除关联” (如果我在这种情况下没记错的话,您基本上需要完全终止您的环境并创建一个新环境)。
此外,您还需要在您的应用程序中添加一些重定向代码,以便在您设置好证书后对传入的任何非安全请求执行 301 重定向。要执行重定向,您需要在传入请求中查找 X-Forwarded-Proto 标头。如果它不安全,您应该重定向到安全端口。例如,我的应用程序代码如下所示:
// in production, only allow secure requests (https)
public function performSecureRedirect(rc) {
// based on domain comparison
var isLive = myEnvironmentData.isLive;
// setting up the health check url is important for smooth beanstalk deployments
// beanstalk issues this healthcheck request via a non-secure port
var isAmazonHealthcheckUrl = rc.event eq "system.healthcheck";
if (isLive and not isAmazonHealthcheckUrl) {
var headerData = getHTTPRequestData().headers;
// x-forwarded-proto is a special header
// setup by Amazon ELB (Elastic Load Balancer)
var requestProtocol = getHttpRequestData().headers['x-forwarded-proto'];
var isSecureRequest = requestProtocol eq "https";
if (not isSecureRequest) {
location("https://" & cgi.server_name & cgi.path_info, false, 301);
}
}
}