Ref:
网络安全系统之四 PKI 体系 - PBDragon - 博客园
一文详解 HTTPS 与 TLS 证书链校验 - xiaxueliang - 博客园
之前对非对称密钥加密和摘要算法都了解,但是如何用其签名,可能一时分不开。
本文就从数字签名——PKI 体系——SSL/TLS 进行讲解,注意并没有把过程细节详细讲清楚,只适合大致了解。
1. 数字签名
加密能够保护消息不被第三方读取,但是攻击者有可能拦截加密的消息并进行篡改,所以需要数字签名来保证消息的完整性,并验证发送者的身份。
数字签名的公私钥是和非对称加密反过来的,具体如下图所示。私钥是签名者用来加密数据的散列值的,而公钥是分发给外界,用来解密散列值,进而验证签名的数据是由签名者发送过来的,且没有被篡改。

所以就有了下图,即消息发送方 Alice 和消息接收方 Bob 的处理过程,先签名后加密发送。

图 2 发送消息的处理过程
至于是否可以将签名加密顺序换一下,先加密后签名呢?拿以下两种风险场景举例:
- 可以看下面的图片,中间人拦截消息并替换签名导致 Bob 以为消息是 Mallory 发送的(前提是 Bob 保存了 Mallory 的验签公钥)。

- 即使 Bob 只会用 Alice 的公钥验签,但中间人一旦在不可信的信道拦截到消息,也可以通过 Alice 的验签公钥验证出消息是 Alice 发送的。
2. PKI 体系
图二保证了消息的机密(明文不被窃取)、完整(消息不被篡改)。但是无法保证可靠(双方身份合法,使用密钥准确)。
- 这就有了 PKI 体系,来验证身份合法性;
- 使用 Diffie-Hellman 密钥交换算法来传递密钥。
PKI 体系,即公开密钥基础建设(Public Key Infrastructure,PKI),通过使用公钥技术和数据证书来提供信息系统安全服务,并负责验证数字证书持有者身份的一种体系。PKI 基础设施采用证书管理公钥,通过第三方可信任认证中心,把用户的公钥和用户的身份信息捆绑在一起,它是具有通用性的安全基础设施,是一套服务体系。
2.1 PKI 体系架构
PKI 体系架构由证书申请者、注册机构 RA、认证中心 CA、证书撤销列表 CRL 组成。
- CA(Certification Authority):负责证书的颁发和吊销(Revoke),接收来自 RA 的请求,是最核心的部分。
- RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA。
- 证书存储库:存放证书,多采用 X.500 系列标准格式。
常见的操作流程为,用户通过 RA 登记申请证书,提供身份和认证信息等;CA 审核后完成证书的制造,颁发给用户。用户如果需要撤销证书则需要再次向 CA 发出申请。
2.2 证书校验
客户端验证服务端下发的证书,主要包括以下几个方面:
- 1、校验证书是否是
受信任的CA根证书颁发机构颁发; - 2、校验证书是否在上级证书的
吊销列表; - 3、校验证书
是否过期; - 4、校验证书
域名是否一致。

CA 机构 颁发证书的基本原理:
服务端生成一对公钥、私钥。服务端将自己的公钥提供给CA机构。CA机构核实服务端公钥拥有者信息: 核实申请者提供信息的真实性:如组织是否存在、企业是否合法、是否拥有域名的所有权等。CA机构签发证书: CA 机构 计算 服务器公钥摘要信息,然后利用CA机构私钥(CA 机构有一对公钥、私钥)加密摘要信息。 加密后的包含加密摘要信息和服务端公钥即CA机构颁发的证书。
客户端 验证服务端公钥的基本原理为:
客户端获取到服务端的证书中的公钥: Https 请求 TLS 握手过程中,服务器公钥会下发到请求的客户端。客户端用存储在本地的CA机构的公钥,对服务端公钥中对应的摘要信息进行解密,获取到服务端公钥的摘要信息A;客户端根据对服务端公钥进行摘要计算,得到摘要信息B;对比摘要信息A与B,相同则证书验证通过;
2.3 证书链校验
实际证书申请中,由于权威的 CA机构 数量不多,若所有的 服务器证书 都向权威 CA 机构申请,那么 CA 机构的工作量就会非常大。因此 CA 机构采取 授权 二级机构 的方式来管理证书申请,经 授权 的 二级机构 也可以签发 服务器证书。

接下来讲下现实的场景,上面 Bob 和 Alice 的场景只是其中的一环。以 https 的 ssl/tls 为例:
3. SSL/TLS
HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一种通过计算机网络进行安全通信的传输协议。 HTTPS 利用 SSL/TLS 来加密数据包,经由 HTTP 进行通信。
其设计的主要目的是,提供对网站服务器的身份认证、保护交换数据的隐私与完整性。
TLS 前身为 SSL,TLS(Transport LayerSecurity) 与 SSL(Secure Socket Layer) 某种程度上指的是同一个概念。
3.1 SSL/TLS 握手
总结:用 非对称加密 的手段 传递密钥,然后 用密钥 进行 对称加密传递 数据。
简要步骤,这里参考大佬的文章,以浏览器输入:https://某宝.com 的过程为例,这里浏览器是 client,某宝是 server
- 浏览器与某宝建立 TCP 连接
- 某宝向浏览器下发自己的数字证书
- Server Key Exchange:某宝向浏览器发送 DH 密钥交换的额外数据
- 浏览器对证书进行合法性校验
- 双方会运行 Diffie Hellman 算法。
证书合法性验证通过之后,浏览器再利用证书中的公钥加密传输 DH 算法需要的其他数据,就会协商出 AES 密钥 enc_key,注意 enc_key 不会在网络上传递。
- 后续的通信都采用协商的
enc_key和加密算法进行加密通信
4. Fiddler 抓包原理

4.1 SSL Pinning
可以看到 app 很容易遭到中间人攻击,因此可以采用 SSL Pinning:
证书锁定(SSL/TLS Pinning)顾名思义,将服务器提供的 SSL/TLS 证书内置到移动端开发的 APP 客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性。