一、背景
在使用抓包工具charles的时候,我们的项目大部分是基于https的,报文没办法直接看到需要进行相应的配置,配置的过程中发现自己对https的知识点有点遗忘了,知识点越混乱,自己越难受,于是抱着这个目的,自己又重新梳理了一遍https的知识点。
二、目标
万物负熵而生,我们要做的是"熵减" 而不是"熵增"。
我们另外一个目标就是打造一个老太太白话都能听到的https讲解。
三、前序
阅读本文的前提是基于你对http的知识点有一个清晰的了解,以及传输层协议tcp和网际层ip协议有一个大概的了解。如果不了解这方面的相关知识,建议学习后在来阅读本文。
四、起因
http天生明文的缺点,这让很多高安全性的场景无从谈起,例如网购、网银,证券、电子政务。例如:你高考考了300分,但是你在老师上报给教务系统的过程中,篡改了分数(改编英国某大学案例)。这个明显不符合我们现实生活的需要。
问:为什么http天生是明文?
答:它使用的是肉眼可读的ascii编码方式。
这种明文的通信方式,我们认为是不安全的,所以促使着我们需要安全的通信方式。
五、安全性
刚刚提到http是“不安全”的通信协议,如果将传输的报文变成密文,就可以是安全的通信协议嘛?
所以我们需要定义什么样的通信是安全的。通常认为,如果通信过程具备了四个特性,就可以认为是“安全”的,这四个特性是:机密性、完整性,身份认证和不可否认。
我们就来讲讲这四个特性:
机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信的人访问,对其他人是不可见的“秘密”。
完整性(Integrity,也叫一致性)是指数据在传输过程中没有被篡改,不多也不少,“完完整整”地保持着原状。
身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。
不可否认(Non-repudiation/Undeniable),也叫不可抵赖,意思是不能否认已经发生过的行为,不能“说话不算数”“耍赖皮”。
知道了这四点,也就明白了https要做的事情,也就是增强上面四点,下面就是围绕着https是怎么增强这四点展开的。
六、正篇
1、介绍
https的官方定义比较短,RFC 文档很小,只有短短的 7 页,里面规定了新的协议名“https”,默认端口号 443,它安全兼容http协议,没有增加新的语法和语义,在学习上没有新的成本。
https相对于http多了一个SSL/TLS层,我们放一张对比图:
2、SSL/TLS
刚从图中看到https多了一层SSL/TLS,那就了解这个是干什么用的。
SSL是网景公司于1994年提出的,有v2和v3两个版本。
SSL发展到v3,被证明是一个非常好的安全通信协议。于是互联网工程组IETF在1999年就把改名为TLS(传输层安全,Transport Layer Security)正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1。
到今天 TLS 已经发展出了三个版本,分别是 2006 年的 1.1、2008 年的 1.2 和去年(2018)的 1.3,每个新版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。
目前应用最广泛的还是1.2这个版本,之前的版本被认为