zoukankan      html  css  js  c++  java
  • 浏览器如何验证HTTPS证书的合法性?

    作者:小林coding
    链接:https://www.zhihu.com/question/37370216/answer/1914075935
    来源:知乎

    浏览器拿到了服务端的数字证书后,要怎么校验该数字证书是真实有效的呢?

    这个过程很多人没有关注到,我这里详细说下。

    数字证书和 CA 机构

    在说校验数字证书是否可信的过程前,我们先来看看数字证书是什么,一个数字证书通常包含了:

    • 公钥;
    • 持有者信息;
    • 证书认证机构(CA)的信息;
    • CA 对这份文件的数字签名及使用的算法;
    • 证书有效期;
    • 还有一些其他额外信息;

    那数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。

    我们用证书来认证公钥持有者的身份(服务端的身份),那证书又是怎么来的?又该怎么认证证书呢?

    为了让服务端的公钥被大家信任,服务端的证书都是由 CA (Certificate Authority,证书认证机构)签名的,CA 就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名,信任的一方签发的证书,那必然证书也是被信任的。

    之所以要签名,是因为签名的作用可以避免中间人在获取证书时对证书内容的篡改。

     

    数字证书签发和验证流程

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

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

    • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
    • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
    • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

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

    • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
    • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
    • 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。


    证书链

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

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

    • 客户端收到 的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证 证书是否可信。于是,客户端根据 证书中的签发者,找到该证书的颁发机构是 “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” 证书中的公钥去验证 证书的可信性,如果验证通过,就可以信任 证书。

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

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

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

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

    最后一个问题,为什么需要证书链这么麻烦的流程?Root CA 为什么不直接颁发证书,而是要搞那么多中间层级呢?

    这是为了确保根证书的绝对安全性,将根证书隔离地越严格越好,不然根证书如果失守了,那么整个信任链都会有问题。

    每次的困难都是实力的提升,每次的消极过后都是心态的升华;
  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/TvvT-kevin/p/15578459.html
Copyright © 2011-2022 走看看