标签归档:HTTP Strict Transport Security

HTTP Strict Transport Security(HSTS)

通过HSTS告诉浏览器默认使用https

一般我们的web服务同时支持http和https,但是会将http重定向到https,而且每次在浏览器直接输域名或者带http的时候,都会执行一次跳转,这样很不简洁,而且存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息。这是我们可以通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。
要实现这个功能,只需要加入一个header就行:

Strict-Transport-Security: max-age=expireTime [; includeSubdomains]

后面的includeSudomians是可选的,expireTime以秒位单位。例如在nginx加上HSTS的话,只需要在https的server配置段加上如下行,然后别忘了reload:

add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";

当浏览器第一次通过HTTPS请求时,服务器响应Strict-Transport-Security 头,浏览器记录下这些信息,然后后面尝试访问这个网站的时候,浏览器都会自动把HTTP替换为HTTPS。

你可以在浏览器F12窗口里看到此条http header, 或者用curl -I也能看到

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 15 Oct 2015 12:27:36 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Pingback: https://imbusy.me/xmlrpc.php
Strict-Transport-Security: max-age=86400; includeSubdomains; preload

当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。另外这个http header加载http中会被浏览器忽略掉。