HTTPS原理
HTTP和HTTPS主要区别
HTTPS概念
HTTPS (全称:Hypertext Transfer Protocol Secure [5]),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1]。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面。
区别

加密:HTTPS在HTTP的基础上加入了SSL/TLS协议,提供了加密传输和身份认证的功能,使得数据在传输过程中更加安全,防止数据被窃取、修改或伪造。
端口号:HTTP使用端口号80,而HTTPS使用端口号443。
证书认证:当Web浏览器通过HTTPS连接到Web服务器时,服务器会向浏览器发送数字证书,该证书包含特定于服务器的信息,包括服务器的公钥。浏览器随后使用此证书与服务器建立安全连接。
费用:HTTPS协议通常需要到CA(证书颁发机构)申请证书,而免费的证书很少,因此可能需要支付一定的费用。
连接方式:HTTP的连接方式简单,是无状态的;而HTTPS的连接方式更为复杂,提供了身份验证和加密通讯。
TCP三次握手
参考:TCP三次握手、四次挥手
HTTPS工作流程

HTTPS的工作流程大致如下:
- 客户端发起HTTPS请求。当用户在
浏览器
中输入一个HTTPS的URL并按下回车键时,浏览器会向服务器发起一个HTTPS连接的请求,这个请求包括了用户的IP地址
、请求的页面等信息。 - 服务器端配置证书。服务器在接收到请求后,会返回一个证书,这个证书包含了公钥以及由CA(Certificate Authority,证书认证机构)对服务器身份的签名。
- 客户端验证证书。客户端在接收到证书后,会首先检查证书是否过期,然后根据证书中的公钥信息,生成一个随机的对称密钥,并用证书中的公钥对这个对称密钥进行加密,然后将加密后的对称密钥发送给服务器。
- 客户端生成随机密钥。客户端生成一个随机的会话密钥,密钥长度达到128位。
- 客户端使用服务器的公钥加密会话密钥。客户端用服务器的公钥加密该会话密钥,产生加密会话密钥。
- 服务器使用私钥解密会话密钥。服务器在接收到加密的对称密钥后,会用自己的私钥对其进行解密,得到对称密钥。
- 客户端与服务器加密通信。服务器和浏览器之间的通信就会通过这个对称密钥进行加密和解密,这样,即使数据在传输过程中被截获,攻击者也无法获取到实际的数据内容。
一旦浏览器和服务器完成了上述的握手过程,两者就建立了一个安全的通信通道,可以进行数据的加密传输,在此之后的所有通信都会通过这个通道进行,直到用户关闭浏览器或者离开当前的网页。
HTTPS混合加密流程

- Client发起请求(端口443)
- Server返回公钥证书(Server中有公钥和私钥,只发送公钥给Client)
- Client验证证书
- Client生成对称密钥,用公钥加密后发给Server
- Server使用私钥解密,得到对称密钥
- C/S双方使用对称密钥:
- 加密明文并发送
- 解密密文得到明文
HTTPS握手过程---TLS1.2
主流程
理解了一些基本概念之后,下面我们将在浏览器访问某些 HTTPS 域名,抓包分析 TLS 的工作流程。
- TCP 三次握手:TLS 是应用层协议,使用传输层的 TCP 进行通信,通信双方在进行 TLS 握手前,需要先进行 TCP 三次握手建立链接。
- TLS 握手:通信双方通过 ECDHE 算法交换密钥,协商出一个共享的会话密钥,对传输的数据进行加密和解密。
- 对称加密通信:因为非对称协商加密性能损耗大,所以通信双方需要通过 TLS 握手协商出对称密钥,使用该密钥进行加密通信,既安全又高效。
TLS 握手过程
TLS 握手原理是双方互换信息,协商出共享的 会话密钥
。
客户端随机数 + 服务端随机数 + 预主密钥 = 主密钥 ==> 会话密钥
TLS 握手协议(Wireshark 抓包)

握手阶段

- 协议:Client Hello,客户端发送它支持的 TLS 版本,加密套件列表,
客户端随机数
给服务端。

- 协议:Server Hello,服务端发送它选择的 TLS 版本,加密套件,
服务端随机数
给客户端。


- 协议:Certificate,服务端发送 CA 证书(公钥 + 证书持有者等信息)给客户端。

- 协议:Server Key Exchange。
- 服务端生成
椭圆曲线私钥
> 生成椭圆曲线公钥
> 服务端的 RSA 私钥实现椭圆曲线公钥签名
。 - 服务端发送:椭圆曲线算法信息,
(服务端的)椭圆曲线公钥
,(服务端的)椭圆曲线公钥签名
给客户端。

- 协议:Server Hello Done。服务端发送确认给客户端,已完成 Hello 阶段流程。

- 协议:Client Key Exchange。客户端生成
椭圆曲线公钥
,并将其发送给服务端。- 客户端接收到证书后,通过本地系统的 证书链 验证该证书是否合法。
- 客户端通过证书公钥解签
(服务端的)椭圆曲线公钥
,确认该数据的完整性和安全性。 - 客户端生成
椭圆曲线私钥
==> 生成椭圆曲线公钥
。 - 客户端使用服务端的 RSA 公钥加密客户端的
椭圆曲线公钥
,并将其发送给服务端。

协议:Change Cipher Spec。客户端通知服务端,确认握手过程中的加密算法和密钥已经生效,表示之后的消息都将使用新的密钥。
(客户端的)椭圆曲线私钥
和(服务端的)椭圆曲线公钥
通过点运算计算出新的点 (x,y),取 x 作为预主密钥
。客户端随机数 + 服务端随机数 + 预主密钥 =主密钥==>
会话密钥
。客户端的会话密钥已协商出来,客户端发送确认给服务端。

协议:Encrypted Handshake Message。客户端将之前的握手数据(发送和接收)做一个摘要,再用会话密钥(对称密钥)加密摘要数据,将密文发送给服务端。作用:
服务端解密密文以此验证双方协商出来的密钥是否一致。
服务端还可以验证确认握手数据的安全性和完整性,保证不被中间人篡改。

- 协议:New Session Ticket。服务器发送该消息给客户端,包含一个新的会话票据,用于快速恢复会话,避免重复握手。

协议:Change Cipher Spec。服务端接收到客户端生成的
椭圆曲线公钥
,也协商出共享的会话秘钥
,并通知客户端表示之后的消息都将使用新的密钥。(服务端的)椭圆曲线私钥
和(客户端的)椭圆曲线公钥
通过点运算计算出新的点 (x,y),取 x 作为预主密钥
。客户端随机数 + 服务端随机数 + 预主密钥 = 主密钥 ==>
会话密钥
。服务端的会话密钥已协商出来,服务端发送确认给客户端。

- 协议:Encrypted Handshake Message。服务端将之前的握手数据(发送和接收)做一个摘要,再用会话密钥(对称密钥)加密摘要数据,将密文发送给客户端,确认握手过程的完成。
