由于HTTP存在明文通信、无法验证服务器的真实性等弊端,使用HTTPS的人变得越来越多。HTTPS并不是新的协议,而是在HTTP基础之上加一层TLS模块,TLS提供了加密、认证以及消息完整性校验的服务,从而保证通信的安全性。
HTTPS过程
HTTPS总的流程就相当于使用非对称加密的方式来传递对称私钥,之后的通信就可以使用这个私钥进行对称加密了。
客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到server的443端口。
服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。
传送证书
这个证书包含了公钥,还包含了很多信息,如证书的颁发机构,过期时间等等。
客户端解析证书
这部分工作是由客户端的TLS来完成的,首先会验证证书是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。
传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
传输加密后的信息
这部分信息是服务端用私钥加密后的信息,可以在客户端被还原。
客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
证书认证
单纯的加密是无法保证通信安全的,TLS还需要通过证书机制来保证访问的服务器是真实的。
证书是由权威机构颁发的,服务端如果能够提供一个合法的证书,说明这个服务端是合法的,可以被信任。整个证书的认证过程如下:
- 客户端获取到了站点证书,拿到了站点的公钥
- 要验证站点可信后,才能使用其公钥,因此客户端找到其站点证书颁发者的信息
- 站点证书的颁发者验证了服务端站点是可信的,但客户端依然不清楚该颁发者是否可信
- 再往上回溯,找到了认证了中间证书商的根证书颁发者。由于根证书颁发者非常少,我们浏览器之前就认识了,因此可以认为根证书颁发者是可信的
- 一路倒推,证书颁发者可信,那么它所颁发的所有站点也是可信的,最终确定我们所要访问的服务端是可信的
- 客户端使用证书中包含的公钥,继续完成TLS的握手过程
如果证书过期了、颁发机构不受信任或者证书绑定的域名和请求的域名不一致等原因,浏览器会抛出异常信息,说明此时的访问是不安全的。