@Kyunban Wong
HTTPS是在HTTP的基础上提供了数据加密的支持,保存了数据的私密性、完整性,并且可以用来认证客户端和服务端的身份。
在普通的HTTP中,数据是明文传输的,很容易出现中间人伪装数据,面对客户端伪装成服务端,面对服务端伪装成客户端,进行窃取数据。

在HTTPS中则使用了非对称公钥机制,对数据进行了加密,又能验证对方身份,基本避免中间人攻击。

HTTPS的加密是通过TLS(Transport Layer Security)安全传输层协议来实现的。在客户端和服务端正常通信之前,会有一个握手过程(这个握手过程会根据Key交换算法的不同而不同,如RSA,Diffie Hellman,以下的讲解以RSA为例,由服务器提供单向认证(也就是存在双向认证的)):

- 首先,浏览器发起ClientHello消息,消息中包括:TLS版本、加密算法集、随机数(客户諯产生);
- 接着,服务器响应一个ServerHello消息,消息中包括:TLS版本、加密算法集、随机数(服务器产生);
- 再接着,服务器继续发送一个Certificate消息,附加服务器的证书;
- 最后,服务器发送一个ServerHelloDone消息;
- 浏览器在收到服务器发来的证书后,验证是否是受信任的机构签发的,是否是真实的服务器;
- 认证服务器的身份后,浏览器使用证书中附带的公钥生成premaster secret作为ClientKeyExchange,并使用公钥加密生成的premaster secret传给服务器;
- 服务器接着使用私钥解密得到premaster secret;
- 然后,浏览器和服务器使用premaster secret和之前收到的对方的随机数生成相同的master key,用于加密和解密后续所有的通信;
- 接着,浏览器向服务器发送ChangeCipherSpec消息,然后发送用master key加密的Finished消息;
- 服务器接收并验证,接着服务器向浏览器发送ChangeCipherSpec消息,然后发送用master key加密的Finished消息;
- 浏览器接收并验证。至此TLS握手完成。
网友评论