HSTS 详解,让 HTTPS 更安全
随着互联网的快速发展,人们在生活中越来越离不开互联网。无论是社交、购物还是搜索,互联网都能给人带来很多的便捷。与此同时,由于用户对网络安全的不了解和一些网站、协议的安全漏洞,让很多用户的个人信息数据“裸露”在互联网中。为此谷歌在 Chrome 68 版本后,其界面将会让使用者更容易了解 HTTP 网页是不安全的,并持续推动网站预设使用 HTTPS。但 HTTP 依旧可以访问使用,为此一些网站可以设置 HSTS 策略,以此来强制浏览器使用 HTTPS 与网站通信,来保障网站更加安全。

多了 SSL 层的 HTTP 协议
在聊 HSTS 之前,先来简单说下 HTTPS。简而言之,HTTPS 就是在 HTTP 下加入了 SSL 层,从而保护了交换数据隐私和完整性,提供对网站服务器身份认证的功能,简单来说它就是安全版的 HTTP。一般来说,HTTPS 主要用途有三个:一是通过证书等信息确认网站的真实性;二是建立加密的信息通道;三是数据内容的完整性。

图中是HTTPS的握手流程,相比 HTTP,HTTPS 传输更加安全。
- 所有信息都是加密传播,黑客无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
强制 HTTPS,保障数据安全
HSTS(HTTP Strcit-Transport-Securit)即 HTTP 严格传输安全, 是一种 Web 安全策略机制,可保护网站免受协议降级攻击和 cookie 劫持、中间人攻击。它允许 Web 服务器声明浏览器(或其他符合要求的用户代理)应用使用安全的 HTTPS 连接与交互,而不是通过不安全的 HTTP 协议。


使用 HSTS 策略后,在缓存时间内,对应的域名请求都将会自动转换为安全的 HTTPS 方法。若浏览器使用 HTTP 访问时,浏览器内部会通过 307 跳转为 HTTPS 访问,并添加响头 Non-Authorizatative-Reason:HSTS。并在 200 响应头字段返回 strict-transport-security: max-age=127800(2 天-自定义)。

与此同时,若用户访问到不安全的 HTTPS 网站时,浏览器会提示用户当前访问的网站不安全且禁止用户访问。如果仅使用 HTTPS 协议,虽然它也会提醒访问的网站的安全性存在问题,但依然可以通过忽略危险进行访问。使用 HSTS 策略后,浏览器会终止任何和所有安全传输错误或警告的任何安全传输连接尝试。也就不能忽略浏览器的不安全提示,无法进行不安全的访问连接,从而进一步保证用户的数据安全。

启用 HSTS 后,使用 HTTPS 访问后会在响应头添加 HSTS 响应字段:
Strict-Transport-Security: max-age=ExpireTime [;includeSubDomains][; preload]
其中 max-age 是必选参数,可以是 ‘0’ 以上的任何值,一般设定缓存 180 天。这个变量定义HSTS 响应头在浏览器中的缓存时间。
Strict-Transport-Security: max-age=15552000
[includeSubDomains] 是可选参数,表示浏览器将此策略应用于当前域名的所有子域。
Strict-Transport-Security: max-age=15552000; includeSubDomains
[repload] 也是可选参数,表示使用 preload 预加载功能,此域名同意申请加入浏览器发发起的 Preload List。
Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
HSTS 预加载,让安全无漏洞
需要注意的是,HSTS 协议必须是已经使用 HTTPS 访问并且缓存到浏览器时才会生效策略,如果用户使用的是 HTTP 协议或直接输入域名(浏览器默认使用 HTTP)的方式进行访问。如http://www.example.com , www.example.com 。虽然可以通过 301 等跳转将 HTTP 跳转到 HTTPS,但跳转使用的 HTTP 明文传输,这就给中间人攻击提供了可能。它可以在使用 HTTP 传输时对跳转信息的信息进行劫持,从而将跳转页面指向攻击者指定的页面。而且 301 跳转不会出现警示信息,客户端很容易在不知情的情况下被攻击劫持。

这时我们就可以使用 HSTS 的预加载功能,预加载可以将指定域名添加到 Preload List 名单中,添加到 Preload List 名单后,浏览器就只能通过 HTTPS 方法来进行访问,从而杜绝 HTTP 访问时被这类攻击的可能。您可以通过访问https://hstspreload.org/ 提交域名申请。但需要注意的是,添加后的域名将会硬编码到浏览器内,除非能保证域名会长久使用 HTTPS,否则请勿随意加入 Preload List。
HSTS 让网站安全等级更高一层
开启 HSTS 后,在 ssllabs 上进行测试,网站的安全等级会从 A 升级至 A+。

开启前等级为:A

开启后等级变为:A+
又拍云也提供HTTPS安全等级检测,有兴趣的小伙伴可前往:https://www.upyun.com/https 尝试下。
Chrome、Safari、Firefox 等浏览器都已经开始相继支持 HSTS,下图为各大浏览器对 HSTS 的支持情况(对于不支持的浏览器,又拍云会忽略此响应头,对用户的访问无影响):

对于那些安全性要求较高的网站,启用 HSTS 无疑是不错的选择。当用户访问网站域名时,都能够让用户使用 HTTPS 来请求网站资源,可以更加有效地保护网站和用户的数据安全,并且减少用户等待 301/302 的跳转时间,带来更好的用户体验。
推荐阅读:
HSTS 详解,让 HTTPS 更安全的更多相关文章
- [转帖]Nginx安装及配置详解 From https://www.cnblogs.com/zhouxinfei/p/7862285.html
Nginx安装及配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP ...
- 【知识详解】Https详解
Https详解 1.什么是Https Http + SSL = Https 一句话说:Https是身披SSL的Http,当使用了SSL后,Http先和SSL通信,再由SSL和TCP通信, 2.为什么需 ...
- <context:component-scan>详解 转发 https://www.cnblogs.com/fightingcoding/p/component-scan.html
<context:component-scan>详解 默认情况下,<context:component-scan>查找使用构造型(stereotype)注解所标注的类,如@ ...
- 减少网站跳转时间,增强网站数据安全——HSTS 详解
近年来随着 Google.Apple.百度等公司不断推动 HTTPS 普及,全网 HTTPS 已是大势所趋.目前多数网站都已经支持 HTTPS 访问,但是在由 HTTP 转向 HTTPS 路程中,不少 ...
- HSTS详解
1. 缘起:启用HTTPS也不够安全 有不少网站只通过HTTPS对外提供服务,但用户在访问某个网站的时候,在浏览器里却往往直接输入网站域名(例如www.example.com),而不是输入完整的URL ...
- 详解全站 HTTPS 访问优化
HTTPS 协议就是 HTTP+SSL/TLS,即在 HTTP 基础上加入 SSL /TLS 层,提供了内容加密.身份认证和数据完整性3大功能,目的就是为了加密数据,用于安全的数据传输. HTTPS ...
- SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
原文地址:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个 ...
- Autofac框架详解 转载https://www.cnblogs.com/lenmom/p/9081658.html
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- SSL协议握手工作流程详解(双向HTTPS流程)
参考学习文档:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段: 1)客户端向服务器发 ...
随机推荐
- C++开发中BYTE类型数组转为对应的字符串
下午密码键盘返回了一个校验码,是BYTE类型数组,给上层应用返回最好是字符串方式,怎样原样的将BYTE数组转为string串呢?不多说,开动脑筋上手干!!! BYTE格式的数组bt{08,D7,B4, ...
- Linux 系统化学习系列文章总目录(持续更新中)
本页内容都是本人系统化学习Linux 时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接 ...
- 学习了解CyclicBarrier
CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行.下面是一个学习过程中采用的示例, ...
- sniffer 简介
http://www.doc88.com/p-095375416629.html 介绍sniffer的工作原理及简单介绍.
- 嵌入Python系列 | 调用Python模块中无参数函数
开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...
- vue实现双向数据绑定的原理
vue实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的. 在MDN上对该方法的说明是:O ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- [ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)
一.Spring的Bean管理(注解方式) 1.1 什么是注解 要使用注解方式实现Spring的Bean管理,首先要明白什么是注解.通俗地讲,注解就是代码里的特殊标记,使用注解可以完成相应功能. 注解 ...
- linux下属主目录的作用
1. /home 用户目录 系统中每一用户都有一个目录 ,被称为主目录,家目录 创建一个普通用户,系统就会在 /home 创建一个以用户为名字的目录2. /tmp 临时文件目录 系统在运行程序中产 ...
- LeetCode Javascript实现 344. Reverse String 292. Nim Game 371. Sum of Two Integers
344. Reverse String /** * @param {string} s * @return {string} */ var reverseString = function(s) { ...