HTTPS 是什么

以前一直以为 HTTPS 是一种与 HTTP 类似的应用层协议,后来才发现 HTTPS 并不是一种协议。https 只是在 URI 中作为 protocol identifier 罢了。HTTPS 其实是 HTTP Over TLS( RFC2818 )的简称,也就是运行在 TLS 协议上的 HTTP 协议,使用 TLS 协议对 HTTP 数据进行加密,从而保证了安全性。

TLS 协议简介

HTTPS 的核心就是 TLS 协议,那么 TLS 协议又是什么呢?TLS 的全称为 Transport Layer Security,也就是在传输层保证安全 RFC5246。主要分为以下四个协议:

TLS 协议中最重要的就是 handshake 了,在握手阶段通信双方以安全的方式协商好用于之后数据传输的加密方式以及各种密钥。

HTTPS 连接过程

大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

HTTPS 的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

41ac7d0df61046f0ab518fba866838dd.webp

客户端请求建立连接

image.png

客户端首先要向服务器请求建立一个安全连接。需要发送给服务器的必要信息有:

  • TLS 协议版本。
  • Cipher Suites。由于双方对一些加密算法的支持程度可能不同,客户端需要将它支持的加密方法发送给服务器,以供服务器进行选择。
  • Session ID。如果提供的话,表示使用前一个会话中已协商好的密钥,而无需再次协商。
  • Random。客户端生成的随机值,用来生成 Master Secret
  • server_name extension。表示访问的是哪个网站。

服务器确定加密套件

image.png

服务器接收到建立连接的请求之后,要发送以下信息:

  • TLS 协议版本。
  • Cipher Suite。从客户端提供的可选加密方式中选择一个。
  • Session ID。本次会话的 ID。
  • Random。随机生成的值,用来生成 Master Secret

服务器发送证书

在发送 Server Hello 之后,服务器还需要把其证书通过 Certificate 发给客户端。

image.png

证书的作用在 “用数字证书证明你是你” 一文中已经阐明。

要是之前确定的加密套件中的秘钥交换算法还需要一些额外的信息,那么服务器还会发送一个 Server Key Exchange,用来传递额外的信息。

image.png

双方完成身份认证

(如果服务器要认证客户端的身份,那么会发送一个 Certificate Request 来向客户端请求证书,客户端收到请求之后会发送 Certificate 给服务器)

最后,(确认客户端身份之后)服务器发送 Server Done 表示我想知道的都已经知道了,该发的也发给你了。

image.png

生成密钥

通过之前的步骤,通信双方认证了对方的身份,明确了加密套件,现在就缺加密密钥了。

此时,客户端会生成一个 premaster secret,并用服务器证书中的公钥进行加密,然后通过 Client Key Exchange 发送给服务器。

image.png

同时,客户端会在本地使用 premaster secret,以及之前在 Hello 阶段双方生成的两个随机数,生成最终的 master secret

服务器收到 Client Key Exchange 之后,使用其私钥解密出 premaster secret。然后使用与客户端相同的方式,生成与客户端相同的 master secret

通知开始加密传输

当双方都得到 master secret 之后,就会发送 Change Cipher Spec 通知对方:我开始用之前商量好的加密方式以及密钥传输数据了。

image.png

确保密钥可用

为了确保之前的协商的确是成功了,双方还需要确认一下双方使用的密钥是不是一致的。怎么确认呢?那就把从 Client Hello 以来握手过程中双方通信的所有信息加密之后,再给对方发送一遍。要是对方发过来的信息解密之后与自己记录的相同,则表示密钥生效了!
image.png

加密套件与密钥

上一节仅介绍了握手的流程,现在来仔细看看其中涉及到的加密套件(Cipher_suite)与 master secret

加密套件

加密套件定义的是在整个数据传输过程中使用到的加密方式。以 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 为例,其包含以下算法

  • 密钥交换算法。用来交换密钥。例如 ECDHE_RSA
  • 对称加密算法。用来加密信息。例如 AES_128_GCM
  • 信息摘要算法。用来计算摘要,防止篡改。例如 SHA256
  • 伪随机函数。生成 master secret。要用到信息摘要算法。

master secret

上一节提到,客户端与服务器会根据 premaster secret 以及二者在 Hello 阶段各自生成的随机数,产生相同的 master secret。二者使用的函数为

image.png

至于生成的 master secret,其格式为

client write MAC key server write MAC key client write encryption key server write encryption key client write IV server write IV

前两个是计算摘要用的 KEY,中间两个是加密时用的,最后两个适用于加密套件使用 AEAD 时。

总结下连接过程

① 证书验证阶段

  1. 浏览器发起 HTTPS 请求
  2. 服务端返回 HTTPS 证书
  3. 客户端验证证书是否合法,如果不合法则提示告警

② 数据传输阶段

  1. 当证书验证合法后,在本地生成随机数
  2. 通过公钥加密随机数,并把加密后的随机数传输到服务端
  3. 服务端通过私钥对随机数进行解密
  4. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输

问题

为什么数据传输是用对称加密?

首先,非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的;

另外,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

为什么需要 CA 认证机构颁发证书?

HTTP 协议被认为不安全是因为传输过程容易被监听者勾线监听、伪造 服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。

首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的 “中间人攻击” 问题。

“中间人攻击”的具体过程如下:

f35348523dd744408647d2b97d2534c6.webp

过程原理:

  1. 本地请求被劫持(如 DNS 劫持等),所有请求均发送到中间人的服务器
  2. 中间人服务器返回中间人自己的证书
  3. 客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输
  4. 中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密
  5. 中间人以客户端的请求内容再向正规网站发起请求
  6. 因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据
  7. 中间人凭借与正规网站建立的对称加密算法对内容进行解密
  8. 中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输
  9. 客户端通过与中间人建立的对称加密算法对返回结果数据进行解密

由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。

浏览器是如何确保 CA 证书的合法性?

1. 证书包含什么信息?

  • 颁发机构信息
  • 公钥
  • 公司信息
  • 域名
  • 有效期
  • 指纹
  • ……

2. 证书的合法性依据是什么?

首先,权威机构是要有认证的,不是随便一个机构都有资格颁发证书,不然也不叫做权威机构。另外,证书的可信性基于信任制,权威机构需要对其颁发的证书进行信用背书,只要是权威机构生成的证书,我们就认为是合法的。所以权威机构会对申请者的信息进行审核,不同等级的权威机构对审核的要求也不一样,于是证书也分为免费的、便宜的和贵的。

3. 浏览器如何验证证书的合法性?

浏览器发起 HTTPS 请求时,服务器会返回网站的 SSL 证书,浏览器需要对证书做以下验证:

  1. 验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证;
  2. 判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证;

e7d864735b9d4ff9a42e761bd44ce513.webp

  1. 判断证书是否被篡改。需要与 CA 服务器进行校验;
  2. 判断证书是否已吊销。通过 CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现,其中 OCSP 可用于第 3 步中以减少与 CA 服务器的交互,提高验证效率

以上任意一步都满足的情况下浏览器才认为证书是合法的。

这里插一个我想了很久的但其实答案很简单的问题:  既然证书是公开的,如果要发起中间人攻击,我在官网上下载一份证书作为我的服务器证书,那客户端肯定会认同这个证书是合法的,如何避免这种证书冒用的情况? 其实这就是非加密对称中公私钥的用处,虽然中间人可以得到证书,但私钥是无法获取的,一份公钥是不可能推算出其对应的私钥,中间人即使拿到证书也无法伪装成合法服务端,因为无法对客户端传入的加密数据进行解密。

4. 只有认证机构可以生成证书吗?

如果需要浏览器不提示安全风险,那只能使用认证机构签发的证书。但浏览器通常只是提示安全风险,并不限制网站不能访问,所以从技术上谁都可以生成证书,只要有证书就可以完成网站的 HTTPS 传输。例如早期的 12306 采用的便是手动安装私有证书的形式实现 HTTPS 访问。

1e9f4c5925fc4929804b8a1bc94cdd87.png

如何保证随机数不会被窃取?

其实 HTTPS 并不包含对随机数的安全保证,HTTPS 保证的只是传输过程安全,而随机数存储于本地,本地的安全属于另一安全范畴,应对的措施有安装杀毒软件、反木马、浏览器升级修复漏洞等。

用了 HTTPS 会被抓包吗?

HTTPS 的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。

但是,正如前文所说,浏览器只会提示安全风险,如果用户授权仍然可以继续访问网站,完成请求。因此,只要客户端是我们自己的终端,我们授权的情况下,便可以组建中间人网络,而抓包工具便是作为中间人的代理。通常 HTTPS 抓包工具的使用方法是会生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,然后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后再返回给终端,从而完成整个请求的闭环。

既然 HTTPS 不能防抓包,那 HTTPS 有什么意义?  HTTPS 可以防止用户在不知情的情况下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。要防止被抓包,需要采用应用级的安全防护,例如采用私有的对称加密,同时做好移动端的防反编译加固,防止本地算法被破解。

总结

以下用简短的 Q&A 形式进行全文总结:

Q: HTTPS 为什么安全? 

A: 因为 HTTPS 保证了传输安全,防止传输过程被监听、防止数据被窃取,可以确认网站的真实性。

Q: HTTPS 的传输过程是怎样的? 

A: 客户端发起 HTTPS 请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于改造对称加密算法的随机数,通过证书中的公钥对随机数进行加密传输到服务端,服务端接收后通过私钥解密得到随机数,之后的数据交互通过对称加密算法进行加解密。

Q: 为什么需要证书? 

A: 防止”中间人“攻击,同时可以为网站提供身份证明。

Q: 使用 HTTPS 会被抓包吗? 

A: 会被抓包,HTTPS 只防止用户在不知情的情况下通信被监听,如果用户主动授信,是可以构建“中间人”网络,代理软件可以对传输内容进行解密。

来源