公钥基础设施(PKI)通过使用公钥技术和数字证书来提供系统信息安全服务,并负责验证数字证书持有者身份的一种体系。PKI基于非对称加密算法,其中公钥用于加密和解密数据,而私钥用于解密和签名数据。
对称加密
客户端和服务端使用同一个密钥key对数据进行加密解密,流程如下:
-
客户端使用密钥 key 加密数据发送给服务端。
-
服务端接收到加密的数据之后使用同一个密钥 key 解密成明文进行阅读。
非对称加密
服务端生成密钥对(公钥和私钥),并将公钥发给客户端,此时客户端只知道密钥对中的公钥,然后客户端使用此公钥加密一个会话密钥 Session Key 发送给服务端,服务端使用私钥解密数据成明文 Session Key。来实现后续的对称加密,具体流程如下:
-
客户端向服务端发送通信请求。
-
服务端向客户端发送密钥对中的公钥。
-
客户端生成会话密钥 Session Key,并将此 Session Key 进行公钥加密后发送给服务端。
-
服务端使用私钥解密,拿到 Session Key 之后,向客户端发送成功拿到会话密钥的响应。
-
客户端和服务端从此使用 Session Key 加密通信。
非对称加密的作用就是协商会话密钥Session Key。
数字签名
数字签名用于验证数据包传输过程中是否被篡改。服务端发送数据包给客户端,同时将数据包中的消息使用 hash 算法运算出散列值,然后将散列值使用私钥加密后放到数据包中,客户端接收的数据包后,使用公钥解密出散列值,然后使用相同的 hash 算法对数据包中的消息进行运算,然后将 hash 运算得到的散列值和公钥解密的散列值做比对,如果一样表明数据包没被篡改。
-
服务端将即将要发送数据包中的消息进行 hash 运算得到散列值,然后将此散列值进行私钥加密。
-
客户端接收到此加密数据包后。
-
公钥解密数据包中的加密部分得到散列值。
-
hash 运算数据包中的消息得到散列值。
-
将以上得到的两个散列值做比对以验证数据包中的消息是否被篡改。
-
此种情况,一般用于客户端验证服务端发送的数据是否被篡改,而不能用于服务端验证客户端的数据是否被篡改,因为客户端没有私钥。
中间人攻击
中间人伪装成服务端与客户端建立会话,同时伪装成客户端与服务端建立会话,从而客户端与服务器进行通信过程中,中间人能够监控客户端与服务端之间的通信,流程如下:
-
客户端向服务端发送通信请求。
-
中间人截获客户端的请求,并将自身伪造成客户端要访问的目标服务。
-
中间人将截获的请求发送到服务端,服务端响应后中间人将响应信息发给客户端。
在此情况下,中间人可在此会话中任意篡改客户端发送的数据包,非对称加密和数字签名都不能防止中间人攻击,因为中间人能够伪造密钥对来与客户端通信。
数字证书
也成为“公钥证书”,用于识别公钥所有者的电子文档。在中间人攻击过程中,客户端误把中间人当作正常的服务器,是因为客户端没有校验与中间人建立会话的证书。使用数字证书可以防御中间人攻击。
证书通常包括:
-
可识别信息,例如证书持有者的姓名、证书的序列号及其到期日期。
-
公钥副本。
-
颁发 CA 的数字签名,用于证明真实性。
证书颁发机构 CA
创建和颁发数字证书的可信第三方组织。客户端校验目标服务器发来的证书需要证书颁发机构 CA 的介入。
从广义上讲,CA 有两种类型:
-
根 CA: PKI 层次结构中最值得信赖的 CA 类型。 根 CA 的证书是自签名的,这意味着它是通过自己的数字签名进行身份验证的。 这些 CA 构成了信任的基础,因为它们的证书用于创建、签署和向从属 CA 或直接向终端实体颁发证书。
-
从属 CA: 由根 CA 或链中更高层的从属 CA 认证的组织。 从属 CA 颁发的证书带有根 CA 的签名,因此继承了信任。 链中的每个证书都负责认证下一个证书的真实性,从而从上到下创建持续可靠的信任路径。
从属 CA 继承了根 CA 的信任,因为从属 CA 证书中携带根 CA 对它的数字签名。
证书链
下图为 https 的通信流程,其实就是证书校验+非对称加密。此标题下要讲解下图中浏览器判断证书的具体过程。
直接举个例子来解释浏览器是如何验证证书的:我们访问 https://www.bilibili.com 网站,此网站会返回的证书链包含两个证书,我们查看此证书的详细内容,如下图:
证书链所含如下:
-
*.bilibili.com 的证书是用来证明 bilibili 服务器身份的 web 证书。
-
GlobalSign RSA OV SSL CA 2018 从属 CA 信任证书。
其中,*.bilibili.com 的证书是用来证明 bilibili 服务器身份的 web 证书,GlobalSign RSA OV SSL CA 2018这个证书是用来证明*.bilibili.com这个证书是有效的,那么 GlobalSign RSA OV SSL CA 2018 这个证书也需要有其他证书来证明其有效性,这样的证书存在于我们的系统中,当我们的电脑安装完成操作系统的时候,这样的证书已经初始化在了我们的操作系统中,如下图就是初始化的根 CA 证书,他们在证书链的最顶端,GlobalSign RSA OV SSL CA 2018 这个证书就是下图中存在的某个证书验证其有效性的:
综上所述:
-
GlobalSign Root CA 存在于我们的系统上,它验证了 GlobalSign RSA OV SSL CA 2018 这个证书的合法性。
-
GlobalSign RSA OV SSL CA 2018 这个证书验证了 *.bilibili.com 这个证书的合法性。
-
*.bilibili.com 证书用于 web 通信,此证书对应的密钥对就是客户端与服务端进行 https 非对称加密的密钥对。
证书校验
首先 *.bilibili.com 这个证书存在一个签名值,如下图:
生成此签名值所需要的私钥就是 GlobalSign RSA OV SSL CA 2018 这个证书对应的私钥,校验此签名值需要我们使用 GlobalSign RSA OV SSL CA 2018 这个证书对应的公钥,这个公钥就存在于GlobalSign RSA OV SSL CA 2018里面,如下图:
由此,使用这个公钥去验证 *.bilibili.com 证书中的签名,来对 *.bilibili.com 证书进行完整性校验,接下来使用相同的方式使用GlobalSign Root CA 证书内的公钥对 GlobalSign RSA OV SSL CA 2018 证书内的签名进行完整性校验,即可完成签名校验。
注:GlobalSign Root CA 这个证书内的签名值使用的私钥就是 GlobalSign Root CA 证书自己的私钥,具体情况如下:
-
*.bilibili.com 证书中的签名所使用的私钥是 GlobalSign RSA OV SSL CA 2018 证书对应的私钥。
-
因此 *.bilibili.com 证书需要使用 GlobalSign RSA OV SSL CA 2018 证书的公钥进行完整性校验。
-
-
GlobalSign RSA OV SSL CA 2018 证书中的签名所使用的私钥是 GlobalSign Root CA 证书对应的私钥。
-
因此 GlobalSign RSA OV SSL CA 2018 证书需要使用 GlobalSign Root CA 证书的公钥进行完整性校验。
-
-
GlobalSign Root CA 这个证书内的签名值使用的私钥就是 GlobalSign Root CA 这个证书自己的私钥。
-
此 GlobalSign Root CA 证书位于证书链的顶端,它存在于系统之中,不需要其他证书来对其进行校验。
-
下图则表示证书之间的签名关系:
由此存在于我们操作系统上的根信任证书将信任传递到 web 证书,使我们能验证 web 证书的合法性。
总结:
-
*.bilibili.com 证书
-
用于进行非对称加密通信的证书(此证书对应的密钥对进行非对称加密会话的建立)。
-
-
中间 CA:GlobalSign RSA OV SSL CA 2018 证书
-
此证书用于*.bilibili.com 证书的完整性校验(证书内部的公钥能够进行完整性校验)。
-
-
根 CA:GlobalSign Root CA 证书
-
此证书用于 GlobalSign RSA OV SSL CA 2018 证书的完整性校验(证书内部的公钥能够进行完整性校验)。
-
以上是证书的完整性校验,浏览器再通过验证证书链中所有证书的主题CN,就能够判断此证书所属公司,如下图: