strict-transport-security配置(简称HSTS)

1,893 阅读5分钟

当网站由HTTP链接转为HTPPS链接时,为了兼容之前使用HTTP访问,和之后使用HTTPS访问的情况,我们通常会使用301,或者302,将HTTP重定向到HTTPS。

一、301

301为永久性重定向,表示当前访问的资源被永久性重定向到另外一个位置。当资源被重定向之后,服务器会返回301,再重定向到新位置,所以这里会请求两次。对于301的重定向,搜索引擎会在抓取新内容的同时,替换原来旧的网址,比如书签的网址、缓存等。

301重定向是利于SEO的,因为旧网址的流量会导入新网址,302不会。

二、302

302为临时性重定向。意思是源网站随时都可能改变重定向的网址。但是302是有危害的,如下:

1、URL劫持

       正常的逻辑是,当网站A302重定向到网站B时,接收到302重定向之后,搜索引擎去抓取网站B的内容,然后交给浏览器显示就行,但是有些搜索引擎,比如Google并不能准确的抓取网站B的内容。

        当网站A的url是一个简短、好记的地址,而网站B的url是乱七八糟、不好记的网址时,302重定向之后,Google很有可能会有可能会显示网站A的网址,但是内容是网站B的内容,这就是URL劫持。当不怀好意的人,将自己的网站A302重定向到你已经写好的网站上B时,由于某种原因,导致网站网址还是A,内容确实B的内容。

2、网站降权

     当网站使用302重定向时,搜索引擎会认为该行为是非法引用,会干扰搜索结果,会给予降权惩罚。

    降权会造成网站的排名大幅度下降、网站的收录量减少等问题。

将网站从HTTP重定向到HTTPS是一个非常常规的做法,但是仍然存在中间人在重定向之前拦截,修改重定向的问题。

二、nginx配置301或者302

301和302重定向的nginx配置

以上是对301和302的介绍,回归正题,将网站从HTTP改为HTTPS,除了重定向之外,还可以使用strict-transport-security。

三、strict-transport-security

1、工作原理

strict-transport-security是一种网络安全的策略,它能防止网站降权、流量劫持(URL劫持)。

nginx的strict-transport-security能够告诉浏览器,该网站禁止使用http进行访问,浏览器应该将http请求转成https访问。有些网站开启了https,但是为了照顾用户体验,因为当用户在浏览器中直接输入域名访问时,默认使用的是http请求。

当在nginx中,给响应的headers中加上以下代码:

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

max-age为必选项,代表HSTS的使用时间,单位秒。

includeSubdomains为可选项,指定该项后,HSTS将会应用于本网站的所有子域名。

preload为可选项,设置此项后,HSTS会将该域名添加到浏览器的预加载列表中,只要预加载列表中有该域名,之后访问都会被强制使用HTTPS。

当证书无效/不安全时,浏览器会显示一个规避警告,但是该警告可以绕过,而使用HSTS之后,则不允许绕过警告,如果要绕过,只能从预加载列表中删除该域名。

2、缺陷

a、首次访问不受保护

HSTS是配置在nginx上的,浏览器必须使用HTTP请求一次,并且浏览器支持HSTS,才会将该域名设置为浏览器的预加载列表中,之后使用HTTPS请求。这就存在一个问题,第一次请求还是HTTP,解决这个问题的办法只能提前将该域名设置在浏览器的HSTS中,但是不能所有的浏览器都提前种吧。。。。

b、时间失效

HSTS有失效时间,即max-age,最大为两年,所以当两次访问时间间隔超过两年,就要重新走一遍HTTP访问,域名列表种域名的过程。而且HSTS的过期时间取决于操作系统的过期时间,攻击者可以伪造NTP的信息,设置错误的时间,造成HSTS过期失效,绕过HSTS。

3、手动添加域名到域名列表

我们可以手动的给浏览器的域名列表添加域名。首先浏览器打开chrome://net-internals/#hsts,打开之后如下图:

在Add HSTS domain中添加域名之后,就域名注入成功了。我访问自己的测试fxt.test.cn,会出现以下截图(因为没有证书,但是强行注入了域名),并且http变成了https。

2、服务器端增加Strict-Transport-Security添加域名

在nginx中配置Strict-Transport-Security之后,使用HTTP访问一次之后,域名会自动被注入域名列表中。

该属性对HTTP是无效的,只有设置了证书和HTTPS,才有效,否则会一直使用HTTP。

HSTS只能在80和443之间切换,其他端口无效。

四、302、303、307

**幂等:**多次请求,效果一样。

GET、HEAD等是幂等请求方式,所以302、303、307并没有什么区别,但是对于POST请求(非幂等),大部分浏览器会将302的POST请求改为GET请求,303是规范强制将POST转为GET,307则是规范要求继续使用POST请求访问。

通过 hstspreload.org/ 检查域名是否合格,以及添加HSTS。