目前,很多站都开始实现 HTTPS 了,本站也开启了 HTTPS,而且还开启强制 HTTPS 机制,对于网站的 HTTP 请求全部 301 跳转到 HTTP,从而实现全站 HTTPS,一切为了安全!
HSTS 的全称是 HTTP Strict-Transport-Security,它是一个 Web 安全策略机制(web security policy mechanism),是国际互联网工程组织 IETE 正在推行一种新的 Web 安全协议,作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。
HSTS 最为核心的是一个 HTTP 响应头(HTTP Response Header)。正是它可以让浏览器得知,在接下来的一段时间内,当前域名只能通过 HTTPS 进行访问,并且在浏览器发现当前连接不安全的情况下,强制拒绝用户的后续访问要求。
HSTS 主要目的是为了解决 HTTPS 网站首次请求时使用的是未加密的 HTTP 协议,也就说用户一般访问我们的网站都是直接在浏览器输入域名,然后我们的服务器检测到是 HTTP 请求,就 301 跳转到 HTTPS 页面,这样有一个问题,因为 HTTP 是不安全的,这个重定向就有可能被攻击者吞掉,然后攻击者一方面冒充服务器,使用 HTTP 与浏览器进行通讯,另一方面冒充浏览器,与服务器使用 HTTPS 建立连接,这就是所谓的 SSLstrip 攻击。
所以 HSTS 还有另外一层好处:增强网站 HTTPS 的兼容性。基本上网站 HTTPS 都是采用 301 强制性跳转,而且还会区分下低版本 IE、不支持 HTTPS 的搜索引擎来忽略 301 跳转,很明显这样做无法照顾到所有情况,采用 HSTS 后,访问 HTTP,支持这个协议的浏览器会自动跳转到 HTTPS 页面,返回码为 307:
返回码为 307
开启 HSTS 很简单,只要在我们网站的响应头里面新增 HSTS 即可,下面简单说下
只需要在站点 server 模块内插入如下配置并重启:
server {
listen 443 ssl http2;
server_name qq52o.me www.qq52o.me;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# 以下略...
Apache 如下配置并重启:
# 先在 Apache 加载 mod_header 库,一般位于 httpd.conf 文件,自行搜索 mod_headers 并取消注释
LoadModule headers_module modules/mod_headers.so
#然后在站点 VirtualHost 里面插入 HSTS 响应头信息,比如:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
如果你用的虚拟主机,或者不会折腾 WEB 软件,那么可以采用更简单的通用方法。原理很简单,通过代码来新增响应头即可,这里只分享一下 php 的做法,其他语言自行参考:
将如下代码插入到网站根目录的 index.php 即可:
header("Strict-Transport-Security: max-age=63072000; includeSubdomains; preload");
将支持 HSTS 的网站全部加入一个 Preload 的清单,支持 HSTS 协议的浏览器请求网站前会查询当前网站是否在清单中,如果是那么直接转换为 HTTPS 请求!从而解决前半程为 HTTP 的问题,如果我们的网站启用了 HSTS,还得将网站提交到这个 Preload 清单才行了。
提交地址:https://hstspreload.org/ (请自备小飞机)
提交直到批准,我们的网站必须强制 301 跳转到 HTTPS,否则无法通过,完成审核后再取消 301 即可。
提交前注意几点:
max-age
必须至少 31536000 秒(1 年)includeSubdomains
和preload
如果主域名旗下有其它子域名没有完成 HTTPS 一定不要做,否则提交后默认主域名下的任何链接都会使用 HTTPS 协议访问,本站昨天去查看也已经通过了。
HSTS Preload List 提交成功
沈唁志|一个PHPer的成长之路!
原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:加入Prelod List使用HSTS解决全站HTTPS兼容性问题