baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 华仔聊技术

  • 业务设计

  • 场景设计

  • 运维

  • 安全

    • 证书公钥私钥
    • 浏览器如何验证证书安全性
    • 面试

    • mac相关工具推荐

    • 开发工具

    • 人工智能

    • 推荐

    • 阅读

    • 工具

    • 计划

    • 产品

    • 云原生

    • go

    • QVM

    • 软件设计师

    • 极客时间

    • 单元测试

    • 其他
    • 安全
    xugaoyi
    2023-10-18
    目录

    浏览器如何验证证书安全性

    CA证书是电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥 (opens new window)体系中公钥的合法性检验的责任。

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

    # 数字证书和 CA 机构

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

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

    那数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。 我们用证书来认证公钥持有者的身份(服务端的身份),那证书又是怎么来的?又该怎么认证证书呢? 为了让服务端的公钥被大家信任,服务端的证书都是由 CA (Certificate Authority,证书认证机构)签名的,CA 就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名,信任的一方签发的证书,那必然证书也是被信任的。 之所以要签名,是因为签名的作用可以避免中间人在获取证书时对证书内容的篡改。

    证书签发流程和验证流程 image.png CA 签发证书的过程,如上图左边部分:

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

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

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

    # 证书链

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

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

    在这四个步骤中,最开始客户端只信任根证书 GlobalSign Root CA 证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而 “GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任 http://baidu.com (opens new window) 证书,于是客户端也信任 http://baidu.com (opens new window) 证书。 总括来说,由于用户信任 GlobalSign,所以由 GlobalSign 所担保的 http://baidu.com (opens new window) 可以被信任,另外由于用户信任操作系统或浏览器的软件商,所以由软件商预载了根证书的 GlobalSign 都可被信任。

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

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

    # 为什么会存在证书链

    最后一个问题,为什么需要证书链这么麻烦的流程?Root CA 为什么不直接颁发证书,而是要搞那么多中间层级呢? 这是为了确保根证书的绝对安全性,将根证书隔离地越严格越好,不然根证书如果失守了,那么整个信任链都会有问题。

    参考: 浏览器如何验证HTTPS证书的合法性? (opens new window) CA证书的签发流程详情 (opens new window)

    编辑 (opens new window)
    上次更新: 2024/02/22, 14:03:19
    证书公钥私钥
    个人

    ← 证书公钥私钥 个人→

    最近更新
    01
    spark基础
    02-22
    02
    mysql读写分离和分库分表
    02-22
    03
    数据库迁移
    02-22
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式