开启HSTS让浏览器强制跳转HTTPS访问
开启HSTS让浏览器强制跳转HTTPS访问
来源 https://www.cnblogs.com/luckcs/articles/6944535.html
在网站全站HTTPS后,如果用户手动敲入网站的HTTP地址,或者从其它地方点击了网站的HTTP链接,通常依赖于服务端301/302跳转才能使用HTTPS服务。而第一次的HTTP请求就有可能被劫持,导致请求无法到达服务器,从而构成HTTPS降级劫持。这个问题目前可以通过HSTS(HTTP Strict Transport Security,RFC6797)来解决。
HSTS简介
HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。采用HSTS策略的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址,以减少会话劫持风险。
HSTS响应头格式
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。
includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。
preload,可选参数,一个浏览器内置的使用HTTPS的域名列表。
HSTS Preload List
虽然HSTS可以很好的解决HTTPS降级攻击,但是对于HSTS生效前的首次HTTP请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了HSTS Preload List
方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用HTTPS协议。
目前这个Preload List由Google Chrome维护,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:
拥有合法的证书(如果使用SHA-1证书,过期时间必须早于2016年);
将所有HTTP流量重定向到HTTPS;
确保所有子域名都启用了HTTPS;
输出HSTS响应头:
max-age不能低于18周(10886400秒);
必须指定includeSubdomains参数;
必须指定preload参数;
即便满足了上述所有条件,也不一定能进入HSTS Preload List
,更多信息可以查看:https://hstspreload.org/
。
通过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及以上版本
Safari从OS X Mavericks起
Internet Explorer及以上版本
HSTS(HTTP Strict Transport Security) 简单来说就是由浏览器进行http向https的重定向。如果不使用HSTS,当用户在浏览器中输入网址时没有加https,浏览器会默认使用http访问,所以对于https站点,通常会在服务端进行http至https的重定向。如果用了HSTS,就可以减少服务端的这次重定向。
当我们部署https时,发现HSTS的这个用处后,立马就使用了它,使用方法很简单——在响应头中加上 strict-transport-security:max-age=31536000 。
但后来通过星巴克的WiFi访问我们的https站点时发现了一个问题。在浏览器中输入网址后,没有出现星巴克WiFi的登录页面,而是浏览器认为这是不安全连接,不允许访问,只能先访问一个http站点,出现星巴克WiFi登录页面并完成登录后才能访问我们的https站点。
背后的原因很简单,由于我们的站点启用了HSTS,浏览器默认会以https方式发出请求,星巴克的WiFi拦截了请求,以http的方式返回了WiFi登录页面,浏览器收到后一看这不安全,立马停止连接。如果不启用HSTS,在服务端进行重定向,就不会有这个问题。
只要基于http进行验证的WiFi都会有这个问题,所以在部署https时是否启用HSTS需要考虑这个因素。如果你原先启用HSTS,现在想取消,不能直接去掉strict-transport-security响应头,而是要改为 strict-transport-security:max-age=0 ,不然之前使用了HSTS的浏览器在过期之前会一直使用HSTS。
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
<VirtualHost *:80>
ServerName www.hi-linux.com
ServerAlias hi-linux.com
...
#将所有访问者重定向到HTTPS,解决HSTS首次访问问题。
RedirectPermanent / https://www.hi-linux.com/
</VirtualHost>
<VirtualHost 0.0.0.0:443>
...
# 启用HTTP严格传输安全
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
...
</VirtualHost>
重启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需要用到第三方模块,具体可参考:https://hstsiis.codeplex.com/
测试设置是否成功
设置完成了后,可以用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,造成网站不能正确访问。唯一的办法是换新域名。
参考文档
http://www.google.com
http://t.cn/RSzfyBb
https://yuan.ga/hsts-strict-https-enabled-site/
https://imququ.com/post/sth-about-switch-to-https.html
http://www.ttlsa.com/web/hsts-for-nginx-apache-lighttpd/
http://www.jianshu.com/p/66ddc3124006
如何关闭浏览器的HSTS功能
来源 http://www.tuicool.com/articles/QbYBne
在安装配置 SSL 证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端上开启 HSTS
(HTTP Strict Transport Security)。它告诉浏览器只能通过HTTPS访问,而绝对禁止HTTP方式。
HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that is specified by a web application through the use of a special response header. Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS. It also prevents HTTPS click through prompts on browsers.
但是,在日常开发的过程中,有时我们会想测试页面在 HTTP 连接中的表现情况,这时 HSTS 的存在会让调试不能方便的进行下去。而且由于 HSTS 并不是像 cookie 一样存放在浏览器缓存里,简单的清空浏览器缓存操作并没有什么效果,页面依然通过 HTTPS 的方式传输。 那么怎样才能关闭浏览器的 HSTS 呢,各种谷歌
度娘
之后,在这里汇总一下几大常见浏览器 HSTS 的关闭方法。
Safari 浏览器
- 完全关闭 Safari
- 删除
~/Library/Cookies/HSTS.plist
这个文件 - 重新打开 Safari 即可
- 极少数情况下,需要重启系统
Chrome 浏览器
- 地址栏中输入
chrome://net-internals/#hsts
- 在
Delete domain
中输入项目的域名,并Delete
删除 - 可以在
Query domain
测试是否删除成功
Opera 浏览器
和 Chrome 方法一样
Firefox 浏览器
- 关闭所有已打开的页面
- 清空历史记录和缓存
- 地址栏输入
about:permissions
- 搜索项目域名,并点击
Forget About This Site
============================= End
开启HSTS让浏览器强制跳转HTTPS访问的更多相关文章
- nginx开启HSTS让浏览器强制跳转HTTPS访问
在上一篇文章中我们已经实现了本地node服务使用https访问了,看上一篇文章 效果可以看如下: 但是如果我们现在使用http来访问的话,访问不了.如下图所示: 因此我现在首先要做的是使用nginx配 ...
- nginx安装SSL证书,并强制跳转https访问
网站最初是nginx代理80端口,实现http访问的.现在要安装SSL证书,使用https访问. 我的nginx根目录是/usr/local/nginx,将申请的SSL证书和key放在/usr/loc ...
- nginx配置http强制跳转https
nginx配置http强制跳转https 网站添加了https证书后,当http方式访问网站时就会报404错误,所以需要做http到https的强制跳转设置. 一.采用nginx的rewrite方法 ...
- 解决:ngxin做http强制跳转https,接口的POST请求变成GET
域名配置了http强制跳转htpps后发现app发起post请求会出现405错误. 所以怀疑是http强制跳转https出现了问题.修改nginx配置如下即可解决: server { listen ; ...
- ngxin做http强制跳转https,接口的POST请求变成GET
http强制跳转https出现了问题.修改nginx配置如下即可解决: server { listen 80; server_name *.snsprj.cn; return 307 https:// ...
- windwos下nginx 配置https并http强制跳转https
windwos下nginx 配置https并http强制跳转https 一.首先配置证书文件 申请证书文件,这里就不做详细过程了,直接看证书文件结果. 这是两个证书的关键文件 打开ngxin下con ...
- Nginx配置http跳转https访问
Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 server{ listen ; s ...
- 服务器 apache配置https,http强制跳转https(搭建http与https共存)
公司linux服务器上的nginx的已经改成https了,现在还剩下一个windows云服务器没配置. 环境 windows wampserver2.5 64位 1.腾讯云申请的ssl 包含三个文件: ...
- tomcat配置https 和 http强制跳转https
https是http+ssl的可进行加密传输,身份认证的网络协议,防止数据在传输过程中被窃取.因此,https将得到越来越广泛的应用,下面是如何配置tomcat服务器让http自动转到https的步骤 ...
随机推荐
- NTC热敏电阻基础以及应用和选择(转)
源:NTC热敏电阻基础以及应用和选择 NTC被称为负温度系数热敏电阻,是由Mn-Co-Ni的氧化物充分混合后烧结而成的陶瓷材料制备而来,它在实现小型化的同时,还具有电阻值-温度特性波动小.对各种温度变 ...
- SQL-W3School-函数:SQL HAVING 子句
ylbtech-SQL-W3School-函数:SQL HAVING 子句 1.返回顶部 1. HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使 ...
- ISO/IEC 9899:2011 条款6.4.9——注释
6.4.9 注释 1.除了在一个字符常量.一个字符串字面量.或一个注释内,字符 /* 引入一个注释.这么一个注释的内容被检查仅用于标识多字节字符,并且要找到 */ 来终结.[注:从而,/* ... * ...
- Github排名靠前的iOS库
//iOS第三方开源库的吐槽和备忘 http://blog.ibireme.com/2013/09/23/ios-third-party-libs/#more-41361 //整理了一份Github上 ...
- iOS的多线程技术
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
- Java中将一个反斜杠转换成两个反斜杠
代码示例: s = s.replaceAll("\\\\", "\\\\\\\\");
- iOS开发设计模式
ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...
- iOS-UITextField的使用
UITextField UITextField * accountField = [[UITextField alloc] initWithFrame:CGRectMake(85.0f, 60.0f ...
- 【嵌入式硬件Esp32】ESP32学习之在windows下搭建eclipse开发环境
一.所需工具 由于项目要用ESP32模块进行开发,折腾了下集成开发环境,现将过程记录下来,以便需要的人使用.其中需要的有交叉编译工具,esp-idf示例代码以及C/C++版的eclipse. 交叉编译 ...
- 【miscellaneous】MPEG2、MPEG4、H264的差异
MPEG2.MPEG4.H264的差异 MPEG-2简介 MPEG-2制定于1994年,设计目标是高级工业标准的图象质量以及更高的传输率.MPEG-2所能提供的传输率在3-10Mbits/sec间,其 ...