说起HTTPS,就不得不先说HTTP。HTTP(HyperText Transfer Protocol,超文本传输协议)是TCP/IP协议簇中应用层的一种协议。通常我们把TCP/IP协议簇分为四层,应用层,传输层,网络层,链路层。HTTP属于应用层协议的一种,它规定了客户端和服务器通信的标准。HTTP协议下必须先由客户端发起请求,然后服务器端才能响应,一次完整的HTTP请求过程是这样的:
- 首先客户端和服务器端建立TCP连接,这个过程就是通常我们所说的三次握手,这里不再详述。
- 之后,客户端按照一定的格式发送请求给服务器端。具体包含请求行(请求的方法,协议的版本,统一资源标识符),请求的header以及可能的请求实体。
- 再后,服务器端对请求做出响应。具体包含状态行(服务器端协议版本,状态码,状态码原因短语),响应的header以及可能的响应实体。
- 最后,客户端收到响应,通信结束,断开连接。
HTTP通信的过程中是不加密的,所有内容明文传输,这样就不免会有安全的隐患,例如:
- 通信内容明文传输,随时可能被窃听。
- 无法确定通信双方的身份。客户端是否是期望通信的客户端,服务器是否是期望通信的服务器。
- 无法保证通信内容的完整性,可能被篡改。
HTTPS就是用来解决上述安全问题的。HTTPS并不是新的协议,它的实质是在HTTP的基础上加了一层SSL协议(Secure Sockets Layer,安全套接层),用以保证通信的安全。我们可以说,HTTPS是身披了SSL外壳的HTTP。通常HTTP直接和TCP通信,现在则是HTTP和SSL通信,SSL和TCP通信。
HTTPS的工作机制
在接下来讲HTTPS的工作机制之前,我们先了解两种加密方法,对称加密和非对称加密。
1. 对称加密
对称加密又称共享密钥加密,是指通信的一方使用密钥加密,另一方使用同样的密钥解密。使用这种方式加密需得把密钥发给通信的对方,可是通信的过程可能被窃听,一旦密钥被窃取,加密也就失去了意义。于是有了另一种加密方式。
2. 非对称加密
非对称加密又称公开密钥加密。是指使用一对匹配的公钥和私钥,通信的一方使用公钥加密,另一方则使用私钥解密。私钥不会公开,公钥则可以发给对方,对方使用公钥加密后,自己使用私钥解密,即便公钥被窃取,根据加密的算法和目前的技术,使用密文和公钥来解密获取原本的信息是不太现实的。不过,由于非对称加密比对称加密更为复杂,如果通信完全使用非对称加密,效率就会很低。
HTTPS则是综合使用了以上两种加密方法,首先通过非对称加密交换一个对话密钥(master secret),然后在之后的通信过程中,用之前获得的对话密钥,使用对称加密进行通信。只要可以保证密钥是通过安全的方式获得的,不会被窃取,那么之后的通信也就实现了安全。可是使用非对称加密交换密钥,我们仍面临一个安全问题,如何保证非对称加密过程中收到的公钥是真实可信的呢?比如公钥在途中可能被篡改。解决的方式是将公钥放在公开密钥证书里,这个证书是由客户端和服务器均信任的第三方数字证书认证机构颁发的。服务器将公钥证书发给客户端,客户端使用数字认证机构的公开密钥对证书的签名进行验证,验证通过则表明服务器的公钥是可信的。
HTTPS的工作机制是这样的:
- 客户端发送Client Hello请求开始SSL通信。信息包括SSL协议版本号,加密组件列表(加密方法,密钥长度等)和一个客户端生成的随机数。
- 服务器端收到请求如果可以进行SSL通信,会发送Server Hello响应。信息包括SSL协议版本号,加密组件(从客户端发送的列表中选定),公开密钥证书和一个服务器端生成的随机数。
- 客户端收到公开密钥证书后,使用数字认证机构提供的公钥对证书的签名进行验证,验证通过后,客户端会做三件事。第一,生成第三个随机数(pre-master secret),并使用服务器端发来的公钥加密发给服务器。第二,发送ChangeCipherSpec通知,以告知服务器接下来将使用协商好的加密方法和密钥加密通信。第三,计算前面的所有消息的哈希值,使用pre-master secret加密提供给服务器做验证。(客户端此时会使用前面三个随机数生成master secret,这个密钥即为后面的对称加密密钥)
- 服务器使用私钥解密拿到pre-master secret,并用它解密数据验证其哈希值,同样发送ChangeCipherSpec通知,以告知客户端将要用协商好的加密方法和密钥加密通信,并将前面的消息的哈希值使用密钥加密发给客户端。(同样地,服务器端也会用和客户端同样的方式生成相同的master secret用于后面的加密通信)
- 客户端收到数据后解密,验证无误则SSL连接正式建立,后面就是普通的HTTP通信过程了,只不过会用master secret加密通信内容。
单向认证与双向认证
事实上,上面的过程只是做了单向认证。也就是说,只对服务器的证书做了认证,可以确认与客户端通信的服务器身份是可信的,但是并没有认证通信的客户端是否是可信的客户端。通信过程中对服务器和客户端均做证书认证称为双向认证,双向认证要求客户端也要有一张数字证书,服务器在上面的第二步会发送Cerficate Request通知,要求客户端发送公开密钥证书进行验证,客户端可以在第三步发送自己的公开密钥证书给服务器做认证。这种认证常见于一些金融机构,比如网银用户通常会有一个USB密钥,这里面就是一张客户端的证书。
HTTPS的优势与不足
HTTPS解决了前面提到的HTTP通信的弊端,通过加密防止通信内容被窃听,通过证书确认通信双方的身份,通过校验码确保通信内容的完整性。不过,HTTPS也有不足之处,比如,HTTPS通信相比HTTP会慢很多,一是因为通信多了一层SSL,二是加密解密本身会消耗很多硬件资源,因此负载增加,处理变慢。同时,使用HTTPS服务器通常需要向数字认证机构购买证书,经济成本也会增加,这也是目前并不是所有网站都是用HTTPS的原因。