https原理和流程
https实际上是使用SSL/TLS对传输数据进行加密的HTTP通信.
如果不使用SSL/TLS的话, 所有的数据是明文传输, 很容易被截取进行中间人攻击.带来的风险有:
- 窃听风险: 第三方可以获知通信内容.
- 篡改风险: 第三方可以修改通信内容.
- 冒充风险: 第三方可以冒充他任身份进行通信.
使用SSL/TSL协议可以规避这些风险:
- 所有信息都是加密传播,第三方无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
基本的运行过程:
基本的运行过程是, 客户端先向服务器索要公钥, 然后用公钥加密信息, 服务器收到密文后, 用自己的私钥解密.
但是这里面有两个个问题:
- 如何保证公钥可信?
解决方法:
公钥放在数字证书中, 证书颁发机构作为公钥背书.
- 公钥加密计算量太大,效率不高.
解决方法:
每一次会话, 单独生成一个对话密钥(session-key), 用他来解密信息.
由于对话密钥是对称加密, 所以加密和解密速度都非常快.
服务器公私钥只用来加密解密对话密钥.
具体的流程:
开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。
假定客户端叫做爱丽丝,服务器叫做鲍勃,整个过程如下:
- 爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
- 鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
- 爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
- 鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
- 爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
其中关键是第三步, 由客户端生成的随机数, 使用公钥加密. 即使中间人获得这个数据, 因为没有私钥, 也无法获得通信内容.