301跳转 https_网站不用http 301跳转 https而直接访问https的方法

通过Chrome的chrome://net-internals/#hsts工具,可以查询某个网站是否在Preload List之中,还可以手动把某个域名加到本机Preload List。

HSTS缺点

HSTS并不是 HTTP会话劫持的完美解决方案。用户首次访问某网站是不受 HSTS保护的。这是因为首次访问时,浏览器还未收到 HSTS,所以仍有可能通过明文 HTTP来访问。

如果用户通过 HTTP访问 HSTS保护的网站时,以下几种情况存在降级劫持可能:

以前从未访问过该网站

最近重新安装了其操作系统

最近重新安装了其浏览器

切换到新的浏览器

切换到一个新的设备,如:移动电话

删除浏览器的缓存

最近没访问过该站并且 max-age过期了

解决这个问题目前有两种方案:

方案一:

在浏览器预置 HSTS域名列表,就是上面提到的 HSTS Preload List方案。该域名列表被分发和硬编码到主流的 Web浏览器。客户端访问此列表中的域名将主动的使用 HTTPS,并拒绝使用 HTTP访问该站点。

方案二:

将 HSTS信息加入到域名系统记录中。但这需要保证 DNS的安全性,也就是需要部署域名系统安全扩展。

其它可能存在的问题

由于 HSTS会在一定时间后失效(有效期由max-age指定),所以浏览器是否强制 HSTS策略取决于当前系统时间。大部分操作系统经常通过网络时间协议更新系统时间,如Ubuntu每次连接网络时,OS X Lion每隔9分钟会自动连接时间服务器。攻击者可以通过伪造NTP信息,设置错误时间来绕过 HSTS。

解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。比如:Windows 8每7天更新一次时间,并且要求每次NTP设置的时间与当前时间不得超过15小时。

支持HSTS浏览器

目前主流浏览器都已经支持 HSTS特性,具体可参考下面列表:

Google Chrome 4及以上版本

Firefox 4及以上版本

Opera 12及以上版本

HSTS部署

服务器开启 HSTS的方法是:当客户端通过 HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的 HSTS字段无效。

最佳的部署方案是部署在离用户最近的位置,例如:架构有前端反向代理和后端 Web服务器,在前端代理处配置 HSTS是最好的,否则就需要在 Web服务器层配置 HSTS。如果 Web服务器不明确支持 HSTS,可以通过增加响应头的机制。如果其他方法都失败了,可以在应用程序层增加 HSTS。

HSTS启用比较简单,只需在相应头中加上如下信息:

Strict-Transport-Security: max-age=63072000; includeSubdomains;preload;

Strict-Transport-Security是Header字段名,

max-age代表HSTS在客户端的生效时间。

includeSubdomains表示对所有子域名生效。

preload 是使用浏览器内置的域名列表。

HSTS策略只能在 HTTPS响应中进行设置,网站必须使用默认的 443端口;必须使用域名,不能是IP。因此需要把 HTTP重定向到 HTTPS,如果明文响应中允许设置 HSTS头,中间人攻击者就可以通过在普通站点中注入 HSTS信息来执行 DoS攻击。

Apache上启用HSTS

$vim /etc/apache2/sites-available/hi-linux.conf

#开启HSTS需要启用headers模块

LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so

ServerName www.hi-linux.com

ServerAlias hi-linux.com

...

#将所有访问者重定向到HTTPS,解决HSTS首次访问问题。

RedirectPermanent / https://www.hi-linux.com/

...

#启用HTTP严格传输安全

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

...

重启 Apache服务

$service apche2 restart

Nginx上启用HSTS

$ vim /etc/nginx/conf.d/hi-linux.conf

server {

listen 443 ssl;

server_name www.hi-linux.com;

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

...

}

server {

listen 80;

server_name www.hi-linux.com;

return 301 https://www.hi-linux.com$request_uri;

...

}

重启 Nginx服务

$service nginx restart

IIS启用HSTS

要在 IIS上启用 HSTS需要用到第三方模块

测试设置是否成功

设置完成了后,可以用curl命令验证下是否设置成功。如果出来的结果中含有Strict-Transport-Security的字段,那么说明设置成功了。

$ curl -I https://www.hi-linux.com

HTTP/1.1 200 OK

Server: nginx

Date: Sat, 27 May 2017 03:52:19 GMT

Content-Type: text/html; charset=utf-8

...

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

X-Frame-Options: deny

X-XSS-Protection: 1; mode=block

X-Content-Type-Options: nosniff

...

对于HSTS以及HSTS Preload List,建议是只要不能确保永远提供 HTTPS服务,就不要启用。因为一旦 HSTS生效,之前的老用户在max-age过期前都会重定向到 HTTPS,造成网站不能正确访问。唯一的办法是换新域名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值