配置和使用HTTP严格传输安全(HSTS)
HTTP严格传输安全(HSTS)是一种安全功能,web服务器通过它来告诉浏览器仅用HTTPS来与之通讯,而不是使用HTTP。
实际使用中用户很少直接在地址栏输入https://这种方式访问,而是通过点击链接或在地址栏直接输入网址然后通过3xx重定向从HTTP页面进入HTTPS页面。那么访问者在重定向前的初始会话是非加密的。这就给了中间人攻击的一个机会,重定向可能会被破坏,从而定向到一个恶意站点而不是应该访问的加密页面。
HTTP 严格传输安全(HSTS)功能使 Web 服务器告知浏览器绝不使用 HTTP 访问,在浏览器端自动将所有到该站点的 HTTP 访问替换为 HTTPS 访问。另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。
注意,如果之前没有使用HTTPS协议访问过该站点,那么HSTS是不奏效的,只有浏览器曾经与服务器创建过一次安全连接并且网站通过HTTPS协议告诉浏览器它支持HSTS,那么之后浏览器才会强制使用HTTPS,即使链接被换成了HTTP。
服务器开启HSTS的方法是当客户端通过HTTPS发出请求时,在服务器返回的响应头中包含Strict-Transport-Security 字段。使用HTTP协议传输时设置HSTS字段无效。
Strict-Transport-Security: max-age=Strict-Transport-Security: max-age= ; includeSubDomains Strict-Transport-Security: max-age= ; preload max-age= :在浏览器收到这个请求后的 秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。 includeSubDomains:可选,如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。 preload:可选,简单来说就是谷歌维护了一个域名列表,凡是注册在列表内的域名都会具有从 http 跳转到 https 的浏览器内部行为。虽然列表由谷歌在维护,但是所有其他浏览器也会尝试使用这个列表。可参考谷歌官方hsts文档 。
Apache中设置HSTS
编辑apache网站配置文件,并加以下行:
# Optionally load the headers module: LoadModule headers_module modules/mod_headers.soHeader always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Lighttpd中设置HSTS
将下述配置增加到你的Lighttpd配置文件:
server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload") }
Nginx中设置HSTS
将下述行添加到HTTPS配置的server块中:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";