【学习笔记】SSL证书安全机制之证书验证

news2025/1/11 14:11:35

前言:每当Client从Server收到一张证书,有2件事Client需要去验证:

  • 证书是否有效?
    • 证书只是文件中的文本
    • Client如何知道内容能够信任?
  • Server是否是证书真正的拥有者?
    • 证书可以公开获取
    • Client如何知道Server是真正的拥有者?

1、证书是否有效?

  • Certificate Authority(须知道CA是证书的实际创造者)
    • 往期内容(《SSL证书里包含的具体内容》)提到过证书包含3个部分(证书数据、签名算法和签名),当CA创建证书时,会将证书数据(如subject、validity、public key等)填到证书中。
    • 之后,CA会创建证书数据所有内容的哈希值(通过哈希算法),如上图1fc616f4...
    • 再然后,CA会用自己的私钥加密这段哈希值,生成的就是签名,如上图ad3a0c30...
    • 之后将ad3a0c30...放置到证书的第三部分,也即签名,这个签名能用来验证证书内容的有效性。
  • Client
    • 需要知道的是,在Client连接到Server前,Client其实已经有了CA的证书(当我们安装浏览器时其实已经安装了,重要的是Client已经有了CA的公钥,该公钥可以用来验证来自CA的所有证书)
    • Client获得了Server的证书
    • 用CA的公钥解密签名,得到一段哈希值H1
    • Client计算证书数据的哈希值H2
      • 如果得到的结果H2和证书签名解密得到的结果H1相同,这就说明证书内容从CA创建它之后没有被修改过

        这也就意味着,如果我们信任CA,其实我们就信任了证书的有效性。

        所以,回答证书是否有效的问题,包含用我们已安装的CA公钥来验证签名。

        以上所讨论的内容是RSA签名证书,而DSA签名证书(只有两步操作,证书生成+证书验证)的过程是类似的。

  • 当CA创建证书时,CA将在证书数据上运行DSA的“证书生成”操作,该操作需要CA的私钥,生成的结果就是签名(这也将被安置于证书的第三部分)。
  • Client之后将在证书签名上运行DSA的“证书验证”操作,该操作需要CA的公钥(客户已经有了),得到的结果是1或0代表True or False,结果如果是1,则表明证书有效。

        一旦证书被验证了,就可以检查以下简单的内容:

  • Validity - 证书是否已到期
  • Subject - 地址栏中的URL和Subject的CN(通用名)是否匹配,或者主体替代名称中的条目(Subject Alternative Name)相匹配
  • 还有一个问题就是证书是否被撤销(Certificate Revoked),因为是不同的过程,将在以后进行讲述

2、Server是否是证书真正的拥有者?

        一般情况下,Client要连接Server,Server会提供自己的证书给Client(假设Server是freessl.cn,那么freessl.cn就是本篇将提到的证书真正的拥有者)。在没有进行SSL连接之前,我们没法阻止钓鱼网站去发送Server的证书给Client,他会伪装自己是freessl.cn,当Client收到了这个证书,证书会表明它是有效的,而这张证书是freessl.cn的,所以Client要验证该证书的时候,就只是检查一下。这就是为什么第二个问题很重要。

  • 要回答这个问题,我们要证明的是Server是否拥有私钥,该私钥匹配证书里的公钥。只有true owner拥有匹配公钥的私钥,钓鱼网站能够伪装说自己有相同的证书,但它没有匹配的私钥。
  • 2种方法:
    • Client Initiated(客户端发起)
      • Client生成随机值(如6d5da73e),然后用服务器的公钥(在证书中)加密这个值(得到3e5f5ff2)
      • 加密后的密文会进行在线传输,那么这个世界上能够拿到3e5f5ff2,并且提取到原始值的,就是Server的私钥(只有True owner才有私钥)
      • Server用自己的私钥解密密文,然后提取出原始值(6d5da73e)
      • 现在双方都有了相同的值,但现在Server不能简单地将解密后的值在线传回给Client,并以此来证明自己可以解密内容(否则任何中间人就可以截取信息并传回Client来假装自己是Server)
      • 取而代之的是,值被用来生成会话密钥(Session Keys),它们是对称密钥,用来保护在Client和Server之间的批量数据传输
      • 方法是,当Client发送应用程序数据给Server时,会用会话密钥来进行保护;然后Server会用会话密钥解密接收到的应用数据。这就表明,Server拥有和Client相同的会话密钥,也就是说Server有着相同的初始值(6d5da73e)来创建会话密钥;同时也表明,Server能够用自己的私钥提取出初始的随机值。这也就向Client表明,该Server是证书的真正拥有者。
    • Server Initiated(服务器发起)
      • 在某些时候进行SSL握手时,Server必须要发送一个值(随机值b87c20db)给Client
      • 在线传输这个值(b87c20db)之前,Server会用自己的私钥来给这个值进行签名
      • 之后该签名以及值会在线传输给Client,然后Client会用Server的公钥来验证该签名,如果签名正确,那就告诉我们,唯一能加密该签名的(能够用公钥验证)就是拥有私钥的人。因此,该Server一定是证书的真正拥有者。
      • 那么,万一这个值像上面一样,被用来生成会话密钥,但这个值是以明文形式在线传输的。我们所做的是签名,签名提供不提供保密性(Confidentiality),只提供完整性(Integrity)和真实性(Authentication)。所以,任何正在聆听的人都能得到该值(b87c20db)的副本。因而,我们不能直接用该值来生成会话密钥。
      • 取而代之,该值需要与其他值(只有Client和Server知道)结合起来,来生成会话密钥
      • 我们发现,第二个方法的值是间接使用的(与其他值结合起来使用),而第一个方法则是直接使用

总结:

关于RSA、DH、DSA更多详情,请看《SSL证书之RSA、Diffie-Hellman和DSA》

  • 我们使用方法1或者方法1,取决于我们想要用什么协议来提供Authentication,什么协议来提供Key Exchange
  • 注意到方法1提到,用公钥加密,私钥解密,唯一能做到的非对称加密协议就是RSA。意味着,如果Client想要用RSA进行Authentication,用RSA来进行Key Exchange,Client就要执行方法1
  • 方法2提到签名,我们注意到有2个协议和签名有关,即RSA和DSA。意味着,如果Client和Server决定用RSA或者DSA来提供Authentication,就要执行方法2
  • 方法2重要的是有Key Exchange,有2个协议(RSA、DH)提供密钥交换。RSA的密钥交换包含公钥加密/私钥解密,那我们注意到方法2没有提到加密,因而,我们不能用RSA来作密钥交换,我们可以用DH来进行密钥交换。
  • 方法2的随机值其实不是随机值,它其实是Diffie-Hellman公钥(回顾下,在DH中,双方公开分享数据,并将其与只有他们知道的值相结合,来达到分享秘密的目的),这个secret就是用来生成会话密钥的
  • 因此,决定选择方法1或者方法2,取决于Key Exchange。如果要选RSA作密钥交换,我们可以选择方法1;如果选择DH作密钥交换,我们可以选择方法2。
  • 此外,2种方法都提供了Authentication和Key Exchange,而Authentication回答了Server是否是true owner的问题

参考文献

1、网站:Practical Networking.net:Practical TLS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OM5光纤:优化您的数据中心性能

随着数据中心需求的持续增长,传统OM3和OM4光纤在传输距离和带宽方面的局限性日益显现。为应对这些挑战,OM5光纤应运而生。OM5光纤又称为宽带多模光纤(WBMMF),通过支持单根光纤上的多波长传输,显著提高了数据…

ubuntu linux搭建lvgl v9

记录一下ubuntu linux搭建 lvgl的过程 本地环境:ubuntu 16.04 ubuntu lvgl sdl2 1 获取源码 git clone https://github.com/lvgl/lv_port_linux.git cd lv_port_linux/ git submodule update --init --recursive查看分支: git branch -a 我选择的是9.2(master分支一直在变动…

无人机执照拿到后怎么就业?方向有哪些?就业率如何?

无人机执照拿到后,就业方向广泛且多样,就业率也呈现出逐年上升的趋势。这主要得益于无人机技术的广泛应用和无人机市场的不断扩大。以下是对无人机执照持有者就业情况的详细分析: 就业方向 1. 无人机飞行操作: 无人机飞手可以从…

34465A-61/2 数字万用表(六位半)

34465A-61/2 数字万用表(六位半) 文章目录 34465A-61/2 数字万用表(六位半)前言一、测DC/AC电压二、测DC/AC电流四、测电阻五、测电容六、测二极管七、保存截图流程前言 1、6位半数字万用表通常具有200,000个计数器,可以显示最大为199999的数值。相比普通数字万用表,6位半…

经典文献阅读之--Representing 3D sparse map points....(用于相机重定位的3D点线稀疏地图)

0.简介 最近在视觉定位和地图制图方面取得了显著的进展,成功地将点特征和线特征进行了整合。然而,将定位框架扩展到包括额外的地图组件往往会导致对匹配任务的内存和计算资源需求增加。《Representing 3D sparse map points and lines for camera reloc…

尝试用java spring boot+VUE3实现前后端分离部署(8/31)

前言 这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不…

通过指令微调提升语言模型性能

人工智能咨询培训老师叶梓 转载标明出处 如何让机器更好地理解和执行人类的指令一直是一个重要课题。Google的研究团队中提出了一种新的方法,通过指令微调(instruction finetuning)来提升语言模型的性能和泛化能力。 他们主要研究了如何通过…

美食|基于SpringBoot+vue的美食网站(源码+数据库+文档)

美食网站 基于SSMvue的美食网站 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 用户模块实现 餐厅模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&…

JavaScript拷贝的艺术:玩转深拷贝和浅拷贝

前言 在实际的项目开发中,我们时刻都在使用数据拷贝功能,赋值、深拷贝和浅拷贝是前端开发中常见的概念,用于复制简单数据类型(字符串、数值、布尔值)和引用类型(对象、数组)。它们的主要区别在…

第十六篇:走入计算机网络的传输层--传输层概述

1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制,传输层需要做数据分割,所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机,无法判断数据报文应该交给哪个应用,传输层给每个应用都设…

中小型局域网组网规划与实施

一、绪论 1.1 背景 本课题以中小型企业网络搭建为背景,实现网络规划与设计和模拟。该企业网有四个部门,人力部、研发部、市场部和财务部,不同部门分别划分VLAN,不同VLAN之间分配不同的IP地址段。内外网之间要互通。 1.2 发展趋势…

关于前端分辨率兼容和显示器缩放兼容的处理

如下图所示,我们的电脑屏幕可以进行缩放,和分辨率的切换。 我们在项目开发中,时常需要适配不同的分辨率。 一般来说,开发人员电脑分辨率显示正常的页面,只会在更小的分辨率尺寸中出现问题。 所以当测试人员给我们提分…

QT项目实战之音乐播放器2.0版本

该版本相较于1.0版本最主要的不同在于连接数据库实现类似于歌曲收藏和取消收藏的功能。 详细情况看我的这篇文章http://t.csdnimg.cn/WS5s8。 效果展示 VSMyMusicShow2.0 define.h UseMySQL.h musicInfo.h VSMyMusicPlayer.h

出现 /www/server/mysql/bin/mysqld: Shutdown complete 的解决方法

目录 1. 基本知识1.1 查找my.cnf目录1.2 配置错误日志2. 问题所示3. 原理分析4. 解决方法1. 基本知识 主要补充一些基本知识的拓展 1.1 查找my.cnf目录 查看mysql默认读取my.cnf的目录: mysql --help|grep my.cnf 截图如下:(为了方便查看具体使用的配置文件在哪个路径)…

2024/9/6黑马头条跟学笔记(三)

D3 内容介绍 jdk8新特性,stream流,lambda表达式 ​ 自媒体前后端搭建 步骤 sql—— 实体—— 微服务拷贝,配置nacos—— spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.233.136:3306/leadnews_…

拥有一个能倾听你心声的「微信AI小助理」,是一种什么体验?

前两天,搞了个微信 AI 小助理-小爱(AI),爸妈玩的不亦乐乎。 零风险!零费用!我把AI接入微信群,爸妈玩嗨了,附教程(上)零风险!零费用!我把AI接入微信群&#x…

解决Django会话中的竞态条件

Django 会话中的竞态条件(race condition)问题通常发生在多个请求几乎同时修改同一个会话数据时,导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景(如实时聊天应用、并发请求处理等)中尤为常见。 1、问…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时,这通常意味着用户的个人信息、登录凭证和其他数据可能面临风险。为了一次性解决这个问题,可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL:确保网站地址以“https”开头,而非“http”。HTTPS协议…

Java项目: 基于SpringBoot+mybatis+maven学科竞赛管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven学科竞赛管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简…

[Redis] 分布式系统与Redis介绍

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…