暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

https证书认证/校验过程和证书链验证过程

小马爸爸的笔记 2020-08-01
5325

https证书认证/校验过程和证书链验证过程

证书认证/校验过程

 client收到server端发送过来的证书的时候,首先需要验证证书是否可信,如何验证证书是否可信呢?我们先来了解一下证书的组成:

 从上面我们可以看到证书包含以下部分:

  1. Validity证书有效时间,包含一个开始生效时间以及一个生效结束时间。
  2. 公钥信息 Subject Public Key Info,包含公钥的加密算法和公钥内容。
  3. fingerPrints信息,fingerprints用来验证证书的完整性,确保证书没有被修改过,其原理就是在发布证书时,发布者根据指纹算法(此处证书使用了SHA-1和SHA-256算法)计算整个证书的hash值(指纹)并和证书放在一起,client在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值相同,则说明证书未被修改过;如果hash值不一致,则表明证书内容被篡改过;
  4. 证书前面的Certificate Signature Value 和Certificate Signature Algorithm,,对应证书签名所使用的Hash算法和Hash值;
  5. 签发该证书的ca机构Issuer。
  6. 证书签发给哪个公司/组织Subject。
  7. 证书的版本Version、证书序列号Serial Number以及Extensions扩展信息等。

 如上图所示,为签名过程和client端验证过程。中间方框为一个数字证书,在制作数字证书时,会将证书中的部分内容进行一次Hash得到一个Hash值,然后证书认证机构简称CA会使用私钥将该Hash值加密为Certificate Signature。

 当证书发送给Client端之后,Client端首先会使用同样的Hash算法获得一个证书的hash值H1。通常浏览器和操作系统中集成了CA机构的公钥信息,浏览器收到证书后可以使用这些公钥解密Certificate Signature内容,得到一个hash值H2。

 比较H1和H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。

 自己通过openssl生成的自签发证书只是使用自己的私钥去加密上图左侧计算出的Hash Value,这个时候client端得到server端发过来的证书之后,仍然会尝试使用浏览器或系统内置的CA机构的公钥去解密,解密出来的hash值H2当然不可能与H1相同,因此浏览器认为该证书不受信任。但是如果我们选择相信该证书并且继续访问该web,访问并不会出现任何问题,这是因为证书中的公钥并未加密,使用该公钥也确实能和server端的私钥进行TLS握手。

证书链的验证过程

 在证书认证过程中,还存在着一个证书信任链的问题,因为我们从ca申请到的证书一般并不是从根ca签发的。 

    下面以百度为例,如下图所示,百度证书分为三层:

  1. 当client访问baidu.com的时候,baidu.com会将百度的证书返回给client。

  2. client端的操作系统或者浏览器中存储有根证书,当校验百度的证书的时候发现baidu.com的证书并不是根证书签的,无法使用本地的根证书去验证baidu.com的证书是否可信。

 于是client根据百度证书的issuer找到签发该证书的机构GlobalSign Organization Validation CA - SHA256 - G2,去CA请求baidu.com证书的颁发机构GlobalSign Organization Validation CA - SHA256 - G2的证书。

  1. 请求到证书后发现GlobalSign Organization Validation CA - SHA256 - G2证书是由根证书签发,而本地刚好有根证书,于是可以利用根证书中的公钥去验证(验证方法见上一节)GlobalSign Organization Validation CA - SHA256 - G2证书,发现验证通过,于是信任GlobalSign Organization Validation CA - SHA256 - G2证书。
  2. GlobalSign Organization Validation CA - SHA256 - G2证书被信任后,可以使用GlobalSign Organization Validation CA - SHA256 - G2证书中的公钥去验证baidu.com证书的可信性。验证通过,于是信任baidu.com证书。

 在这四个步骤中,最开始client端只信任根证书GlobalSign Root CA证书的,然后GlobalSign Root CA证书信任GlobalSign Organization Validation CA - SHA256 - G2证书,而GlobalSign Organization Validation CA - SHA256 - G2证书又信任baidu.com证书,于是client端也信任baidu.com证书。这样的一个过程就构成了一条信任链路,整个证书信任链验证流程如下图所示。

参考链接

https://www.cnblogs.com/snowater/p/7804889.html


文章转载自小马爸爸的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论