原文链接:https://www.globalsign.com/en/blog/what-is-hsts-and-how-do-i-use-it/
想象一下,要是你在你特别喜欢的饭店或者说你刚刚从会议室回到你的旅馆房间,并且你想要使用它们的免费wifi,你是否曾经注意到其实密码就在过道或者房间很显眼的某个位置,并且很长时间都不会改变
这时候一个心怀不轨的黑客在与你同一家旅馆订了一间房间,他说不定此时正在监听这个不安全网络中的所有链接。
黑客通过数据包嗅探技术,分析并且注入后门到目标网络。
对于任何一个只是依赖于301转发来完成http到https的网站,黑客可以抓取http上的流量信息。但是使用hsts(http strict transport security) 可以阻止黑客破解你的SSL加密
那么到底什么是HSTS?
首先它是一个网络服务器指令,它会通知浏览器,或者终端设备如何通过发送的响应头处理链接
它在response中设置了Strict-Transportation-Security参数,它会强迫这些链接是构建https之上的。
为什么你的公司应该实现了HSTS?
道理很简单,就像你永远不会离开家的时候不锁门。有些时候,你甚至有可能在家门口安装金属探测器来增加防护的等级。想想吧,你的数据就好比是你家里值钱的东西,这些东西是需要被保护起来的东西。只是实现了https的网站有时候并不安全,因为总有方式通过http到达你的网站。而HSTS强迫你的浏览器和应用链接使用https(当然你的网站必须是https的)。
建立重定向从http到https的301,并不能完全保护你的域名,在http的重定向过程中仍然存在安全隐患。
黑客仍然可以捕获网站的cookies, sessionid 或者 强迫重定向到钓鱼网站
而如果在响应头中设置了Strict-Transport-Security, 收集信息的工作对于黑客们来说近乎不太可能。
HSTS的实现,目前现状?
谷歌在2016年7月29号就已经全面推行HSTS的工作
HSTS与2009年起草,2015年在托尼.斯哥特的努力下有了里程碑式的发展
facebook, google, gmail, github 以及 paypal等主要的社交网络和支付平台今天都已经完成了这项工作
那么如何在你的网站去实现HSTS呢?
如果在你的网站内容架构方案中使用了子域名,你需要一个通配符的证书去覆盖https only。否则你需要确保你安装了授信部门颁发的证书。
初始阶段会测试你的网页应用,用户登录和会话管理,每5分钟HSTS过期,持续测试一周至一个月。修正在部署中出现的任何问题。
max-age = 604800(一周), max-age = 2592000(一个月)。测试完成后添加preload参数(可选)
更多请参考:https://hstspreload.org/
在你确保HSTS在你的网页应用上没问题以后,可以将过期时间设置为2年
HSTS成熟的要求
1. 网站必须有授信的SSL证书。 可以通过https://globalsign.ssllabs.com/去检查你的SSL证书
2. 重定向所有的HTTP请求到HTTPS,301
3. 所有的子域名必须包含在你的SSL证书里。考虑使用通配符证书
4. 在HTTPS请求头中设置HSTS
5. 过期时间必须至少10886400秒或者18周,推荐2年
6. 如果有子域名的HTTPS,那么includeSubDomainS 指令必须指定
7. preload指令必须指定
如何给你的服务器安装HSTS
Apache Web Server
你可以把以下的配置加入根目录.htaccess文件,诸如public_html或者httpdoc
# Use HTTP Strict Transport Security to force client to use secure connections only
Header always set Strict-Transport-Security "max-age=300; includeSubDomains; preload"
Lighttpd
路径:/etc/lighttpd/lighttpd.conf
server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ("Strict-Transport-Security" => "max-age=300; includeSubDomains; preload") }
Nignx
https://gist.github.com/inetbiz/a07ba3bdbc7ee392020eec811ed02c08
add_header Strict-Transport-Security 'max-age=300; includeSubDomains; preload; always;'
IIS Server
protected void Application_BeginRequest(Object sender, EventArgs e) { switch (Request.Url.Scheme) { case "https": Response.AddHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload"); break; case "http": var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); break; } }
什么是Preloading
HSTS preloading是浏览器自建的函数,通过一个全局的主机列表强制网站使用https only
这个列表由chromium项目编译,chrome,ff和safari使用。这些网站 不依赖HSTS相应头来增强保护策略,浏览器实际已经要求使用https only, 在任何连接和交互发生前就已经推送了HSTS
这样袭击者就无法拦截在HTTP上重定向的内容,当然HSTS的相应头仍然需要,对于有些不使用要预加载HSTS清单的浏览器,这是必须的。