如下图所示,为数字证书签发和验证流程:

Https客户端校验证书流程  第1张

CA签发证书的过程,如上图左边部分:

  • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;

  • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;

  • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

  • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;

  • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;

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

但事实上,证书的验证过程中还存在一个证书信任链的问题,因为我们向 CA 申请的证书一般不是根证书签发的,而是由中间证书签发的,比如百度的证书,从下图你可以看到,证书的层级有三级:

Https客户端校验证书流程  第2张

对于这种三级层级关系的证书的验证过程如下:

  • 客户端收到 baidu.com 的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证 baidu.com 证书是否可信。于是,客户端根据 baidu.com 证书中的签发者,找到该证书的颁发机构是 “GlobalSign Organization Validation CA – SHA256 – G2”,然后向 CA 请求该中间证书。

  • 请求到证书后发现 “GlobalSign Organization Validation CA – SHA256 – G2” 证书是由 “GlobalSign Root CA” 签发的,由于 “GlobalSign Root CA” 没有再上级签发机构,说明它是根证书,也就是自签证书。应用软件会检查此证书有否已预载于根证书清单上,如果有,则可以利用根证书中的公钥去验证 “GlobalSign Organization Validation CA – SHA256 – G2” 证书,如果发现验证通过,就认为该中间证书是可信的。

  • “GlobalSign Organization Validation CA – SHA256 – G2” 证书被信任后,可以使用 “GlobalSign Organization Validation CA – SHA256 – G2” 证书中的公钥去验证 baidu.com 证书的可信性,如果验证通过,就可以信任 baidu.com 证书。

在这四个步骤中,最开始客户端只信任根证书 GlobalSign Root CA 证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA – SHA256 – G2” 证书,而 “GlobalSign Organization Validation CA – SHA256 – G2” 证书又信任 baidu.com 证书,于是客户端也信任 baidu.com 证书。

总括来说,由于用户信任 GlobalSign,所以由 GlobalSign 所担保的 baidu.com 可以被信任,另外由于用户信任操作系统或浏览器的软件商,所以由软件商预载了根证书的 GlobalSign 都可被信任。

Https客户端校验证书流程  第3张

操作系统里一般都会内置一些根证书,比如我的 MAC 电脑里内置的根证书有这么多:

Https客户端校验证书流程  第4张

这样的一层层地验证就构成了一条信任链路,整个证书信任链验证流程如下图所示:

Https客户端校验证书流程  第5张

怎么防止下载的文件被劫持和篡改?

可以采取以下措施:

  • 使用HTTPS下载:确保下载链接使用HTTPS协议,通过SSL加密传输数据,防止中间人攻击和数据篡改。

  • 验证文件完整性:在下载文件后,使用哈希算法(如MD5、SHA-256)计算文件的哈希值,与官方提供的哈希值进行比对,验证文件是否被篡改。