我想在我的应用程序中实现HSTS。
我有一个ELB终止SSL并将流量转发给我的应用程序,这是一个用作反向代理的apache服务器。
我知道,为了实现HSTS,我需要将头严格-传输-安全性添加到我的请求。
不幸的是,我似乎无法在Apache服务器上实现它,因为它必须添加到HTTPS虚拟主机中,而且我的Apache只配置了http虚拟主机,因为SSL在ELB上终止。
这意味着当ELB向前传递时,它必须向请求中添加头部严格-传输-安全性。
我该怎么做?我能为我添加一些安全策略吗?
发布于 2017-10-31 03:47:18
我询问了AWS的支持,答案是目前ELB无法在来自客户端的请求中添加HSTS头。因此,我决定使用我的Apache服务器找到一个解决办法。下面是我找到的解决方案:
HSTS RFC指出:
HSTS主机不能在通过非安全传输传送的HTTP响应中包含STS标头字段。
我当时所做的是在、http=>https重定向之后设置头http=>https。由于此重定向具有标志L,这意味着301重定向将不包括标头,但是任何https请求都会。我的apache配置如下所示:
<VirtualHost *:80>
...
#http=>https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
#hsts
Header set Strict-Transport-Security "max-age=31536000"
发布于 2018-02-16 21:03:01
如果您正在使用Apache 2.4+,您可能熟悉表达和指令<If>
、<ElseIf>
和<Else>
。
我在开发环境、暂存环境和生产环境之间有一个复杂的配置,所以依赖带有[L]
标志的RewriteRule
不会为我削减它。
这给我带来了下面的解决方案,我把它放在了我的.htaccess中
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000"
</If>
</IfModule>
它在我的环境中工作得更好,我觉得它对于满足RFC来说更可靠。
如果从未直接命中实例,则可以删除"%{REQUEST_SCHEME} == 'https'
部分,但这是我在dev环境中调试过程的一部分。
非常感谢佩德雷罗为HSTS的实际规范指出了正确的方向。
发布于 2020-04-21 13:57:37
请注意,由于Apache < 2.4不支持这一点,所以最好将其封装在<IfVersion >= 2.4>
中,如下所示:
<IfVersion >= 2.4>
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</If>
</IfModule>
</IfVersion>
https://stackoverflow.com/questions/47025426
复制相似问题