我在 AWS Elastic Beanstalk 上设置 HTTPS 时遇到问题。我目前的问题是,虽然 HTTPS 可以正常工作,但用户必须包含端口号。
我的目标是让“example.xyz”重定向到“ https://example.xyz ”。目前我必须去地址:“example.xyz:433”访问EB。
目前,我只尝试为 EB 负载均衡器工作的 HTTPS。它将通过 HTTP 与 EC2 通信。理想情况下,我会进行端到端加密,但你知道一次只有一步。
设置:
- 64 位 Amazon Linux/4.5.0 上的 Node.js v8.11.1
- 经典负载均衡器
- 我的日志正在发送到 CloudWatch
- 我有自己的域名 - 通过 Route 53 购买。
我已使用 ALIAS 将流量从域重定向到我的 AWS EB:
name: "" Type: A IPv4 (default) Routing Policy: Simple (default) Evaluate Target Health: No
我已经使用 ACM 设置了证书
我使用以下 *.config 让负载均衡器监听 HTTPS:
option_settings: aws:elb:listener:433: SSLCertificateId: arn:aws:acm:us-east-X:XXXXXXXX:certificate/XXXXXXXXX ListenerProtocol: HTTPS InstancePort: 80
生成的端口设置(来自 EB 控制台):
- Port: 80
- Protocol: HTTP
- Instance Port: 80
- SSL: ---
- Enabled: On
和
- Port: 433
- Protocol: HTTPS
- Instance Port: 80
- SSL: XXXXX
- Enabled: On
我已经使用了 Apache 和 Nginx 来尝试这个。通过互联网挖掘后,我找到了获取这些服务器以强制 HTTP 到 HTTPS 的说明。以下是我使用过的示例:
阿帕奇:
files:
"/etc/httpd/conf.d/ssl_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
Nginx:
files:
"/tmp/45_nginx_https_rw.sh":
owner: root
group: root
mode: "000644"
content: |
#! /bin/bash
CONFIGURED=`grep -c "return 301 https" /opt/elasticbeanstalk/support/conf/webapp_healthd.conf`
if [ $CONFIGURED = 0 ]
then
sed -i '/listen 80;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /opt/elasticbeanstalk/support/conf/webapp_healthd.conf
logger -t nginx_rw "https rewrite rules added"
exit 0
else
logger -t nginx_rw "https rewrite rules already set"
exit 0
fi
container_commands:
00_appdeploy_rewrite_hook:
command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
01_configdeploy_rewrite_hook:
command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
02_rewrite_hook_perms:
command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
03_rewrite_hook_ownership:
command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
Apache 源代码:如何在弹性豆茎上强制使用 https?
两台服务器似乎都有一些问题,但是我无法访问 apache 日志,因为它们没有出现在我的 CloudWatch 中。
但这是我观察到的行为以及来自 nginx 服务器的日志:
1) 转到:example.xyz:433
工作正常,浏览器说我们是安全的。Nginx 注销:
172.31.16.42 - - [16/May/2018:07:54:34 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36" "171.6.246.51"
请注意,nginx 的 304 直接设置正在运行
2) 转到:example.xyz
请求旋转了很长时间,最终超时。
没有注销输出。但是,当请求最终超时时,地址栏会充满:https ://example.xyz/ ,这对我来说是重定向正常工作的另一个迹象。
谁能建议如何解决这个问题?如果您需要更多信息,请与我们联系。
干杯