HTTPS的原理
HTTP是明文传输,为了跟HTTP增加安全性,就产生了HTTPS。HTTPS并不是一个单独的协议,是在HTTP的基础上用TLS/SSL进行加密。
SSL是TLS的前身,它们都是加密安全协议,现在绝大部分浏览器都不支持SSL,而是支持TLS。
1. 对称加密
简单来说就是发送方和接收方用同样的规则来为数据进行加密,也可以说用同样的钥匙来解开密文。问题就是如果有第三方知道加密的规则以后,就很容易破解了。
例如,这里,如果有第三方知道上图双方加密和解密都是用算法G,那么第三方就可以利用算法G来破解,这就是对称加密的弊端。
2. 非对称加密
非对称加密的核心是,用两个密钥来进行加密和解密,分别是公开密钥和私有密钥。公开密钥是所有人都知道的密钥,私有密钥仅仅是持有方才有的密钥。一般来说,私钥就放在服务器里,数据经过公钥加密就只能被私钥解密。
如果应用到客户端和服务端的话,就是服务端拥有成对的私钥和公钥,然后公布自己的公钥让客户端知道,客户端用公钥把自己的数据进行加密,加密后的数据用公钥反而无法解密,一定要用服务端的私钥才能解密,这样的非对称加密其实也叫公钥加密,因为不同于对称加密中只使用一把私钥进行加密。当然,加密的过程是用算法进行加密的。
3. 证书
为了确定自己在沟通的对象是不是自己想沟通的对象,比如有时会把域名输错了,例如B站的域名。
这时两个域名长得很像,这种情况下就可能会有不法分子伪装B站域名让你来访问,还好HTTPS解决了这个问题,因为服务端需要申请SSL证书,来证明这个域名就是B站。
这里说的是SSL证书,而不是TLS证书,因为SSL证书更为人熟知。SSL证书其实就是保存在源服务器的数据文件,要让SSL证书生效就需要向CA(Certificate Authority 证书授权中心)申请。这个证书除了表明域名是属于谁的,日期等信息以外,重要的是这个证书里还包括了公钥和私钥。简单来说,服务器安装了SSL证书以后,用户就可以通过HTTPS来访问服务器了,当然浏览器也会把HTTP的默认端口80改为HTTPS的默认端口443。
4. TLS究竟是用哪种加密方式呢?(TLS1.2)
TLS其实对称和非对称两种加密都有用上。
(客户端的起始)
首先正常的TCP三次握手是不变的,TCP三次握手以后,客户端发送了一个Client Hello给服务端,客户端就会告诉服务端它支持TLS 1.2版本和支持的加密套件(不同的加密算法组合),然后就会生成一个随机数发给服务端。
TLS的抓包过程
(服务端收到客户端的打招呼后的一系列响应)
当服务端收到客户端的Hello之后,会发生Server Hello给客户端,在响应报文里会告诉客户端,服务端确认支持的TLS版本以及选择的加密套件,并且服务器也生成一个随机数发生给客户端;
接下来服务端会再发一个响应Certificate,来出示服务器自己的证书,这样浏览器就可以根据对照自己的证书信任列表来确认这个服务器是否可信;
服务器再发送Server Key Exchange,把公钥发送给了客户端,注意这里,不会把私钥傻傻地发出去。如果服务器也想要客户端的证书会在这里发出请求,比如登录网银就很可能需要这个步骤了;
服务器一下子发了这么多响应,最后还要告诉客户端发送完了,就是发送Server Hello Done 给客户端。
截至到目前这些请求和响应依旧还未进行加密。
(接下来就轮到客户端来处理这些响应了)
Client Key Exchange这一步是个重点也是个难点,客户端会生成第三个随机数,也叫预主密钥。这第三个随机数不会直接发送出去,而是会用刚刚收到的公钥进行加密,并且把这个加密后的随机数发送给服务器;
接下来就是Change Ciper Spec,这一步就是告诉服务器往后的数据就用商议号的算法和密钥来加密了;
最后Encrypted Handshake Message,表示客户端这边的TLS协商已经没有问题了,加密开始。
(服务端的响应)
服务端收到客户端的预主密钥后,会使用私钥对其解密,这样服务器就知道预主密钥了,而且只有客户端和服务端知道这预主密钥。 因为没有进行直接传输,没有其他人知道这预主密钥是什么,除非私钥被泄露了。
同样地后面服务器也发来了Encrypted Handshake Message,表示服务器这边准备好了。也表示着TLS的握手已经成功了,可以给数据加密进行交换了。
5. 握手总结
客户端先发送TLS版本,加密套件和第一随机数给服务端;
服务端收到以后,发送TLS版本,加密套件和第二随机数给客户端,并发送自己的公钥和证书给客户端。都发生完毕就告知客户端;
客户端再生成一个随机数,称为第三随机数(预主密钥),这个预主密钥不会直接发送出去,而是用刚刚收到的公钥进行加密后再发送出去,然后客户端这边的TLS协商已经没问题了,加密开始;
服务端收到客户端的预主密钥以后,会用自己的私钥进行解密,这样服务器就知道预主密钥了。而且只有客户端和服务端知道这个预主密钥。
到这里,前面的步骤都是非对称加密。
最后客户端用预主密钥,第一随机数和第二随机数计算出会话密钥。服务端也用预主密钥,第一随机数和第二随机数计算出会话密钥。
各自得到的会话密钥是相同的。为了得到这个会话密钥,后面的会话大家都只使用这个会话密钥对数据进行加密,也就是后面使用的是对称加密。
大家都使用同一个私钥,会话后面不使用非对称加密是因为大家都看到消耗资源非常大,而且得到会话密钥之后,就没人知道密钥是什么了,因此后面使用对称加密。
如果与其他服务器沟通就是建立新的会话,会话密钥也不相同,会话密钥只应用再当前会话,更加提高了安全性。
6. HTTPS的总结
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的HTTP通道,在HTTP的基础上通过身份认证和传输加密阶段保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入TLS(Transport Layer Security 安全传输层协议)/SSL(Secure Sockets Layer 安全套接层协议),HTTPS 的安全基础是 TLS/SSL,因此加密就需要TLS/ SSL。
TLS/ SSL是为网络通信提供安全及数据完整性的一种安全协议。SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL。 TLS的全称是Transport Layer Security,安全传输层协议。是SSL3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。虽然TLS与SSL3.0在加密算法上不同,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。 在HTTPS数据传输的过程中,需要用TLS/SSL对数据进行加密,然后通过HTTP对加密后的密文进行传输,可以看出HTTPS的通信是由HTTP和TLS/SSL配合完成的。 HTTPS的特点:
- 内容加密:混合加密方式,对称加密和非对称加密。
- 验证身份:通过证书认证客户端访问的是正确的服务器。
- 数据完整性:防止传输的数据被中间人篡改。
HTTP和HTTPS的区别
由于HTTP简单快速的特性,当客户端向服务器端请求数据的时候,只需要传送请求方法和路径就可以取到结果,基于TCP,默认端口号为80,耗时可以简略计算为1RTT,传递的数据全部是明文传输,几乎没有安全性。 HTTPS是基于TLS的,而TLS又基于TCP,当客户端向服务器端请求数据的时候,服务器会将客户端重定向到该服务器的443端口,进行新的TCP连接,此时服务器会返回一个证书文件,而不是响应报文体。此时客户端验证证书文件紧接创建对称密钥,之后重新和服务器建立TLS连接,当服务器返回ACK确认之后,连接正式建立,此时上方整个过程耗时为3RTT,并且之后和服务器的通信数据都是通过对称密钥加密过的,几乎无法破解。
HTTP和HTTPS的不同点总结如下:
- HTTP是基于TCP的,而HTTPS是基于TLS的;
- HTTP的往返时间为1RTT,而HTTPS的往返时间为3RTT;
- HTTP只需要创建一次TCP连接,而HTTPS需要在TCP连接后,再进行TLS连接;
- HTTP的默认端口号为80,而HTTPS的默认端口号为443;
- HTTP的安全性很差,而HTTPS的安全性很强
- HTTPS虽然在安全方面有很大的优势,但是缺点也很明显,如下:
- HTTPS握手阶段耗费时间,几乎是HTTP的数倍,会延长页面的首次渲染时间和增加耗电
- HTTPS的效率没有HTTP高,如果部分数据内容实际上并不需要加密,会平白浪费计算机资源
- HTTPS的证书需要购买,功能越强大的证书价格更高
- HTTPS的加密并不能阻止某些网络攻击,如黑客攻击、拒绝服务攻击等