关于HSTS的定义
HSTS全称是HTTP Strict Transport Security,中文名HTTP严格传输安全,诞生于2012年,至今已有五年历史。它是一种Web安全策略机制(web security policy mechanism),IETF标准轨道协议,其功能是强制客户端(如浏览器)使用HTTPS与服务器创建连接。
作用
强制浏览器直接发起HTTPS请求,拒绝不安全的链接
抵御SSL剥离攻击,防止中间人攻击。
HSTS工作原理:
HSTS的核心点是HTTP响应头(HTTP Response Header),是由安全的HTTPS站点发出。
HSTS Header的样式:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
其中:
max-age是必选参数,单位为秒,它代表着HSTS Header的指定时间,通常设置为1年,即31536000秒,在此时间内,网站必须通过 HTTPS 协议来访问。
includeSubDomains,可选参数,意味着当前域名及其子域名均开启HSTS保护。
Preload,可选参数,预加载到浏览器缓存。
完整的HSTS流程图
HSTS这个响应头只能用于HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。当浏览器检测到HTTPS站点发出HSTS Header,就会默认该站点只能通过HTTPS(SSL 或者 TLS)访问,并将此信息缓存时间为31536000s,也就是1年。如果浏览器发现当前连接不安全的情况下,将强制拒绝用户的后续访问要求。例如,当访问Google搜索引擎的时候,如果当前通信连接存在安全问题,浏览器将会彻底阻止用户继续访问Google,如下图所示。
浏览器阻止用户继续访问不安全的站点
因此,站长们必须要确保站点必须使用安全有效的SSL证书,并正确部署。如果当浏览器接收到HSTS Header(假如有效期是1年),一旦网站的证书出现错误,用户无法选择忽略,用户将在接下来的1年时间内都无法访问您的网站,直到证书错误被修复,或者用户主动清除浏览器缓存。
HSTS Preloading List
HSTS必须要在浏览器访问过的网站一次以后才会生效,如果希望提前生效,需要申请 HSTS Preloading List(HSTS预加载列表)。
如果站长要想把自己的域名加进这个列表,首先需要满足以下条件:
拥有一个有效合法的SSL 证书;
在同一台主机上提供重定向响应,以及接收重定向的HTTPS请求;
确保所有子域名均启用 HTTPS;
在根域名的HTTP响应头中,加入HSTS Header,并满足下列条件:
过期时间最短不得少于18周(10886400秒)
必须包含includeSubDomains参数
必须指定preload参数
满足条件后,在HSTS Preload List的官网上(https://hstspreload.org)提交申请。
检查域名是否加入到Preload List
从提交申请到完成审核,成功加入到内置列表,时间为几天到几周不等,要视具体情况而定。可通过官网https://hstspreload.org或在Chrome地址栏里输入chrome://net-internals/#hsts查询状态。
支持HSTS浏览器
目前HSTS Preloading List由 Google Chrome 维护,HSTS Preloading List使用覆盖Chrome、Firefox、Safari、IE 和 Microsoft Edge 等主流浏览器。
Google Chrome 4及以上版本
Firefox 4及以上版本
Opera 12及以上版本
Safari从OS X Mavericks起
Internet Explorer 11及以上版本
如何开启HSTS
启动HSTS并不难,只需要在服务器配置文件上设置HSTS Header,就可以成功开启HSTS机制。下面介绍不同服务器设置HSTS Header。
①、Nginx服务器
只需要在站点server模块内插入如下配置并重启:
server {
listen 443 ssl http2;
server_name zhangge.net;
# 直接在server插入测试居然不生效,最后发现要在location ~ *php 内插入:
location ~ [^/]\.php(/|$) {
add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”;
# 以下略…
②、Apache服务器
Apache如下配置并重启:
# 先在Apache加载mod_header库,一般位于httpd.conf文件,自行搜索mod_headers并取消注释
LoadModule headers_module modules/mod_headers.so
#然后在站点VirtualHost里面插入HSTS响应头信息,比如:
<VirtualHost *.*.*.*:443>
Header always set Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”
</VirtualHost>
③、LigHttpd
将下述配置增加到 Lighttpd 配置文件(一般是 /etc/lighttpd/lighttpd.conf)并重启:
server.modules += ( “mod_setenv” )
$HTTP[“scheme”] == “https” {
setenv.add-response-header = ( “Strict-Transport-Security” => “max-age=63072000; includeSubdomains; preload”)
}
④、通用方法
如果用的虚拟主机,或者不会折腾WEB软件,那么可以采用更简单的通用方法。通过代码来新增响应头即可,这里只分享一下php的做法,其他语言自行参考:
将如下代码插入到网站根目录的index.php即可:
header(“Strict-Transport-Security: max-age=63072000; includeSubdomains; preload”);
无论是HTTPS协议还是HSTS机制,首要的大前提必须拥有一个有效合法的SSL证书。CA机构是全球颁发SSL证书的唯一合法机构,因此获取SSL证书的正确渠道是合法的CA机构申请获取。数安时代(GDCA)是已通过国际WEBTRUST认证,具备国际化的电子认证服务能力的国内CA机构之一,旗下的SSL证书包括信鉴易 TrustAUTH、GlobalSign、Symantec、GeoTrust SSL证书等多个国际品牌,证书数量达数十种,站长们可根据自身的需求向数安时代GDCA机构申最佳的SSL证书,或向其公司的专业人员资讯,选取合适的SSL证书。数安时代(GDCA)的专业团队将会为您提供最佳的HTTPS解决方案。