一、什么是HTTPS、TLS、SSL
HTTPS,也称作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。

二、HTTP和HTTPS协议的区别
1、HTTPS协议需要到证书颁发机构(Certificate Authority,简称CA)申请证书,一般免费证书很少,需要交费。
2、HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
3、HTTP和HTTPS使用的是完全不同的连接方式,使用的端口也不一样,前者是80,后者是443。
4、HTTP的连接很简单,是无状态的。
5、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。
从上面可看出,HTTPS和HTTP协议相比提供了
· 数据完整性:内容传输经过完整性校验
· 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
· 身份认证:第三方无法伪造服务端(客户端)身份
其中,数据完整性和隐私性由TLS Record Protocol保证,身份认证由TLS Handshaking Protocols实现。
三、证书
1、什么是证书呢?

2、证书中包含什么信息
证书信息:过期时间和序列号
所有者信息:姓名等
所有者公钥
3、为什么服务端要发送证书给客户端
互联网有太多的服务需要使用证书来验证身份,以至于客户端(操作系统或浏览器等)无法内置所有证书,需要通过服务端将证书发送给客户端。
4、客户端为什么要验证接收到的证书
中间人攻击

5、客户端如何验证接收到的证书
为了回答这个问题,需要引入数字签名(Digital Signature)。

将一段文本通过哈希(hash)和私钥加密处理后生成数字签名。
假设消息传递在Bob,Susan和Pat三人之间发生。Susan将消息连同数字签名一起发送给Bob,Bob接收到消息后,可以这样验证接收到的消息就是Susan发送的

当然,这个前提是Bob知道Susan的公钥。更重要的是,和消息本身一样,公钥不能在不安全的网络中直接发送给Bob。
此时就引入了证书颁发机构(Certificate Authority,简称CA),CA数量并不多,Bob客户端内置了所有受信任CA的证书。CA对Susan的公钥(和其他信息)数字签名后生成证书。
Susan将证书发送给Bob后,Bob通过CA证书的公钥验证证书签名。
Bob信任CA,CA信任Susan, 使得 Bob信任Susan,信任链(Chain Of Trust)就是这样形成的。
事实上,Bob客户端内置的是CA的根证书(Root Certificate),HTTPS协议中服务器会发送证书链(Certificate Chain)给客户端。
正式开始HTTPS的内容:
一、HTTPS的基本原理
从上面可知,HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
HTTPS其实是有两部分组成:HTTP +SSL/ TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。

1. 客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个HTTPS网址,然后连接到server的443端口。
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥(随机值)通过某种算法混合在一起,这样除非知道私钥(随机值),不然无法获取内容,而正好客户端和服务端都知道这个私钥(随机值),所以只要加密算法够彪悍,私钥(随机值)够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务端用私钥(随机值)加密后的信息,可以在客户端被还原
8. 客户端解密信息
客户端用之前生成的私钥(随机值)解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
二、HTTPS的通信流程和握手过程
1、HTTPS对应的通信时序图:

2、HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
1. 浏览器将自己支持的一套加密规则发送给网站。
客户端 -》 服务端 【Client Hello】

2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
服务端 -》 客户端 【Server Hello】
首先服务端选择一个随机数 Random,并选择一个加密套件算法

【Certificate, Server Key Exchange, Server Hello Done】
接着服务端继续发送 Certificate 、Server Key Exchange 和 Server Hello Done 。其中 Server Hello Done 表示服务器完成了握手步骤。
- Certificate:在 TLS 握手的第一个消息中,服务器发送一个证书,该证书包含了服务器的公钥,以及服务器身份信息。客户端通过验证证书来确定服务器的身份是合法的。
- Server Key Exchange:如果服务器没有发送证书,或者客户端不想验证证书,服务器将发送一个包含公钥的 Server Key Exchange 消息来与客户端协商密钥,从而建立安全通信。
- Server Hello Done:在 TLS 握手的 Server Hello 阶段,服务器告诉客户端其支持的协议及密码套件。当服务器完成协商后,它会发送 Server Hello Done 消息,告诉客户端它已经完成了所有握手步骤,等待客户端发送后续消息。

3.浏览器获得网站证书之后浏览器要做以下工作:
客户端 -》 服务端 【Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message】
- Client Key Exchange(客户端密钥交换):在此步骤中,客户端会发送一个消息,其中包含一个随机生成的 Pre-Master Secret,这是一个用于生成对称密钥的重要材料。Pre-Master Secret 会通过非对称密钥加密传输,以确保安全性。
- Change Cipher Spec(修改密码规范):此步骤并不发送任何数据,而是告知对方从此处开始使用新的对称加密算法和密钥。在客户端发送 Change Cipher Spec 消息后,任何后续传输的数据都将使用新的加密方式和密钥进行加密。
- Encrypted Handshake Message(加密握手消息):在此步骤中,握手中的所有消息都将使用新的对称加密算法和密钥进行加密并发送。这包括服务器发送的证书、服务器密钥交换、服务器 Hello Done 等消息,以及客户端发送的 Finished 消息。在此之后,TLS 握手过程完成。

4. 服务端生成会话票据 Session Ticket,以实现会话恢复支持
服务端 -》 客户端【New Session Ticket, Change Cipher Spec, Encrypted Handshake Message】
- New Session Ticket
New Session Ticket是在TLS连接过程中,服务器端向客户端发送其生成的加密Session Ticket。Session Ticket主要用于实现会话复用,可以让客户端在下一次连接时重用之前已建立的TLS会话,从而可以减少加密过程中的握手时间和CPU资源负载。Session Ticket中包含了客户端和服务器端的随机数、过期时间以及加密套件相关的信息。
- Change Cipher Spec
在 TLS 握手过程中,Change Cipher Spec是在计算对称加密密钥和MAC密钥后,用于通知对端即将使用这些密钥加密和解密数据的消息。Change Cipher Spec消息是在握手完成之前,客户端和服务器端都需要发送给对端,以确保对称加密算法和密钥已就绪,并在之后的数据传输过程中正确使用。
- Encrypted Handshake Message
Encrypted Handshake Message是在Change Cipher Spec消息之后发送。在这步操作中,客户端和服务器端会将所有握手过程中的消息都进行加密,并通过TLS Record Protocol传输到对端。这个步骤的目的是确保握手过程中的所有信息都被加密保护。Encrypted Handshake Message中通常包含了前面握手过程中约定好的协议版本、加密套件、公钥、证书等等信息。

至此整个握手流程结束,后续发送的数据将使用 ”对称加密算法“ 加密发送。
5. 网站接收浏览器发来的数据之后要做以下的操作:
客户端发送数据到服务端,加密的信息是应用层协议 HTTP

对于所有 ACK 消息仍使用 TCP 协议,并不用 TLS。
总结:
当客户端和服务器通过 TLS 连接进行通信时,它们必须通过握手过程进行身份验证,建立秘密密钥,并协商加密算法和其他参数。TLS 握手过程包括以下步骤:
- 客户端向服务器发送一个
ClientHello
消息,其中包含支持的加密算法、SSL/TLS 协议版本、随机数和可选的会话ID。 - 当服务器收到
ClientHello
消息时,它会向客户端回复一个ServerHello
消息,其中包括选择的加密算法
、SSL/TLS 协议版本
、服务器随机数
和 可选的会话ID
。 - 服务器还将发送一个数字证书,该证书由一个信任的认证机构(CA)签署,证明服务器的身份。证书中包含基于公钥密码学的加密算法,服务器使用该算法向客户端提供公钥。
- 客户端使用服务器提供的公钥验证证书的签名,并利用公钥加密随机生成的另一个密钥,称为“客户端密码”。
- 客户端生成一个
PreMasterSecret
,该密钥是由协商的 SSL/TLS 版本和随机生成的客户端随机数
和服务器随机数
组成。客户端使用服务器公钥加密该密钥并将其发送到服务器。 - 服务器使用其私钥解密客户端消息中的
PreMasterSecret
,并使用它计算MasterSecret
,该密钥是用于加密和解密通信数据的对称密钥。服务器向客户端发送ChangeCipherSpec
消息,该消息指示从该点开始使用MasterSecret
来加密通信数据。 - 客户端向服务器发送一个
ChangeCipherSpec
消息,然后生成一个与服务器 Cipher Suite 相匹配的MasterSecret
。客户端向服务器发送一个Finished
消息,该消息是使用协商的MasterSecret
的散列值计算的。 - 服务器收到
ChangeCipherSpec
和Finished
消息后,创建自己的MasterSecret
,并使用客户端发送的Finished
消息的散列值来验证通信正在按预期工作。 - 客户端和服务器之间的加密会话就此建立,他们可以安全地交换任意数量的数据,直到有一方决定将连接关闭为止。
- 如果双方想要长时间保持连接状态,服务器将向客户端发送一个
NewSession Ticket
以实现会话恢复支持。
总体而言,TLS 握手过程确保安全地建立通信连接,保护敏感数据免受中间人攻击和其他安全威胁。
参考: