1. 前言
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
2. 回顾TCP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
2.1. TCP的三次握手
建立一个TCP连接主要有三个步骤:
- client端首先发送一个SYN包告诉server端: 我要建立一个链接,我的序号是x
- server端接收到SYN包后回复client一个ACK包(将x+1): 我收到了;同时server端也发送一个SYN包给client: 我这边已经准备好了,我的序号是y,你可以连接了。
- client收到之后,回复一个ACK包(y+1): 好,我已经连接好了。
这样一个TCP连接成功建立。
关于tcp三次握手找到一张比较形象的图:
2.2. TCP四次挥手
在断开TCP连接时,主要有四个操作:
- client发送一个FIN包给server端:我要断开连接了
- server端回复client端一个ACK包:好,我知道了
- server端发送一个FIN包给client端:那我关闭连接了
- client恢复一个ACK包给server:好的
把上面的图改了一下:
3. 准备知识
3.1. 对称加密
对称加密值得是加密解密都是用同一个密钥。对称加密只有一个密钥,作为私钥。
常见的对称加密算法:DES,AES,3DES等。
对称加密加密和解密使用的是同样的密钥,所以速度较快。但正因为只依赖一个密钥,密钥一旦暴露,便毫无秘密可言,所以安全性不高。
3.2. 非对称加密
非对称加密有两个密钥,一个公钥,一个密钥。加密和解密使用不同的密钥。公钥加密的信息,只有私钥才能解密;私钥加密的信息,只有公钥才能解密。
常见的非对称加密算法:RSA,ECC等。
非对称加密使用了公钥和密钥一对密钥,安全性较高,但是加密与解密的速度较慢。
4. HTTPS工作流程
说了这么多,终于到了本文的主要内容:HTTPS工作过程。HTTPS是建立在HTTP基础之上的,因此在进行HTTPS连接之前,TCP的三次握手需要先执行。然后才是HTTPS的连接建立。上面说到的对称加密和非对称加密也会在过程中看到。下图是https过程:
-
client请求server。这一步向server发送客户端支持的加密协议,SSL版本信息等。
-
server接收到请求之后,确定加密方式,以证书的形式回应client,其中包含证书公钥以及一些其他信息。
-
client收到响应之后会验证证书是否有效,如果无效则提示警告信息(自己生成证书就会出现)。如果有效,客户端会生成一个随机数(会话密钥),并用公钥进行加密,然后传递给server。
-
server收到公钥解密的内容,利用私钥进行解密获得客户端生成的随机数(会话密钥)[非对称加密]。然后server将获得的随机数当成私钥堆数据加密一段数据,作为握手消息发送给client。
-
client使用之前生成的会话密钥对server回应的消息进行解密[对称加密]。至此https连接建立完成。
-
后续会话数据传输client发送给server的消息均通过会话密钥进行加密,server通过会话密钥进行解密处理。server响应给client也通过会话密钥进行加密,client通过会话密钥解密呈现给用户。
HTTPS在建立连接的过程中通过非对称加密进行会话密钥的传输,待连接建立成功之后,会话密钥只有客户端和服务端知道,后续的所有数据传输均通过会话密钥进行对称加密。这样可以使后续的数据传输速度更快。