什么是HTTPS
简单的讲HTTPS是在HTTP协议的基础上,增加了保密措施的一种协议。所以其主要作用是保证通信的安全,其主要解决了如下几个问题:
- 防止第三方冒充服务器。
- 防止第三方拦截通信报文,窃取通信中请求报文、响应报文的内容。
- 防止第三方拦截通信报文,篡改报文内容。
实现原理
加密方式
为了达到以上的目的,最容易想到的就是加密了。而加密的方式一般情况下可以分为3中形式。
- 对称加密算法:加密、解密用同一个密钥,速度快。
- 非对称加密算法:加密、解密用不同的密钥。公、私钥对。私钥加密的,所有公钥都可以解密,公钥加密的,只有私钥可以解密。
- Hash算法:一种单向加密,理论上不可解密。
那么在HTTPS认证过程中都用到那种加密方式了呢?
答案是以上3种均都利用上了。
HTTP通信过程
- 客户端向服务端发起请求
- 此时请求报文有可能被截获,泄漏请求信息
- 请求有可能被截获,并冒充服务器,给其响应
- 服务端向客户端发起响应
- 此时请求报文有可能被截获,泄漏响应信息
HTTPS通信过程
通信内容加密
既然HTTP通信过程中,请求报文、响应报文均可能被窃取,这里只要把request、response加密就可以了。
这个加密用哪种方式呢?
- 对称算法:需要客户端、服务端拿到相同的密钥用来加密、解密,要达到同步必然需要通信。如果说事先在客户端和服务端预安装好这个密钥,则服务端需要管理海量的密钥,显然是不现实的。
- 非对称算法:加密请求报文时,看上去并没有问题,但是在响应时,由于加密是服务器利用私钥加密的,所以所有拥有其公钥的客户端都可以解密,这样就有可能被其他有其公钥客户端窃取报文并进行解密窥探响应信息。并且由于是非对称算法,速度比较慢。
- Hash算法:这个算法不可解密,传过去也没有什么用。
由于非对称算法,所有有公钥的客户端都可以解密响应报文,其不能够被选择,Hash算法更是没有用武之地,所以只剩下对称算法可以考虑,那么怎么解决密钥的同步问题呢?
既然同步密钥也需要通信,那么还是加密呗,但是如果还用对称加密,则变成鸡生蛋、蛋生鸡的问题了。
给对称算法的密钥加密
HTTPS是将这个密钥用非对称的算法进行加密(实际上,只是加密了生成这个密钥的一部分原料)。
- 在服务端保存这个一个密钥。
- 在所有的客户端保存着服务器的密钥对应的公钥。
- 这个密钥由客户端生成,用公钥加密,传给服务端,这样只有服务端有密钥可以解密,即使报文被拦截,也无法解密。
这样看上去就没有什么问题了,但是实际情况中,客户端不可能知道所有服务的公钥,只要访问某个https网站的时候,才需要知道这个公钥。所以这个公钥在客户端访问服务端的时候,由服务端发给客户端就可以了。
这时,有人问了,这个公钥不需要加密了么?当然没有必要了,其他客户端只需访问这个网站就会得这些信息,不用拦截其他人这么麻烦,其公钥是颁发给大家的,不需要保密。
最后一个问题,怎么防止第三方冒充目标服务器呢?黑客给你发一个他的公钥,之后的加密全都变得没有意义。
证书
服务端为了向客户端证明自己,会给客户端发一个凭证,这里的这个凭证就是证书。其证书不仅用证明服务其身份的作用,其本身还必须带有防伪造的能力。
这里一般是服务器向第三方颁发证书的机构申请一个证明自己的证书,利用这个证书证明自己的身份,并且客户端会根据这个颁证的机构的算法去进行防伪验证,看看证书是否伪造,如果不是伪造的,则没有问题。
这个防伪的验证算法是什么呢?
- 颁发证书时,会根据申请方的信息用hash类的加密算法生成摘要信息,客户端也会用这个算法生成摘要,与其进行对比。
- 并对这个摘要进行非对称加密,防止对其篡改
- 将加密后的摘要信息、生成摘要的加密算法、和证书的基本信息放在一起,作为证书颁发给申请方,
- 客户端利用颁证机构的公钥,对其加密后的摘要进行解密。
这里的客户端的公钥是怎么来的呢,由于颁证机构并不多,操作系统里对一些信用良好的机构进行了信任处理,将其公钥事先安装好了。
认证流程
- 服务提供者向办证机构申请证书。
- 将证书发布到web服务中
- 客户端向服务端发起申请,并发起一个随机数a。
- 服务端将证书返回客户端证明自己,并发会一个随机数b。
- 客户端根据证书的颁发机构,拿到预装的公钥,对其摘要进行解密
- 客户端根据证书中的摘要算法,进行客户端的摘要计算,并将计算结果和解密后的摘要进行比较
- 如果不一致,说明证书是伪造或被篡改过,立即停止通信
- 如果一致,则生成第三个随机数c,并用a、b、c生成对称加密算法的密钥,并用证书中的公钥(对应服务其的密钥)对c进行加密,然后将c发给服务端
- 服务端用密钥将c解密,并用a、b、c生成对称加密算法的密钥。
- 之后的通信将报文进行签名,并与报文一起进行对称加密(防止他人恶意篡改信息,以试错方式进行密钥的破解,以增加破解难度)
对于https的理解参考了网上很多文章,以下
https://www.cnblogs.com/jhj117/p/5601585.html
https://www.jianshu.com/p/b0b6b88fe9fe
https://mp.weixin.qq.com/s/Wh9fSky9pi0T6ewCsBeobA