我们先不去探究ssl的实现原理,我们先从设计者的角度去思考如何去建立一个安全的传输通道

从第一个消息开始

客户端A向服务端B发送一条消息,这个消息可能会被拦截以及篡改,我们如何做到A发送给B的数据包,及时被拦截了,也没办法得知消息内容并且也不能查看呢?

利用对称加密

要做到消息不能被第三方查看以及篡改,那么第一想法就是对内容进行加密,同时,该消息还需要能被服务端进行解密。所以我们可以使用对称加密算法来实现,密钥S扮演着加密和解密的角色。在密钥S不公开的情况下,就可以保证安全性?

没那么简单

在互联网世界,通信不会这么简单,也许是这样。

会存在多个客户端和服务端产生连接,而这个客户端也许是一个潜伏者,如果他也有对称密钥S,那相当于上面的方案是不可行的?如果服务端和每个客户端通信的时候使用不同的加密算法呢?

似乎能够完美解决问题,然后?密钥如何分配呢?也就是服务端怎么告诉客户端该使用那种对称加密算法呢?
解决办法似乎只能通过建立会话以后进行协商了?

协商过程又是不安全的

协商过程,意味着又是基于一个网络传输的情况下去动态分配密钥,可是这个协商过程又是不安全的,怎么破?

非对称加密出马

非对称加密算法的特点是:私钥加密后的密文,只要有公钥,都能解密,但是公钥加密后的密文,只有私钥可以解密。私钥只有一个人有,而公钥可以发给所有人

这样就可以保证A/B向服务器端方向发送的消息是安全的。似乎我们通过非对称加密算法解决了密钥的协商的问题?但是

公钥怎么拿?

使用非对称加密算法,那么如何让A、B客户端安全地持有公钥?

那么我们逐步思考,有两种我们能想到的方案:

1. 服务器端将公钥发送给每一个客户端

2. 服务器端将公钥放到一个远程服务器,客户端可以请求到 (多了一次请求,还得解决公钥放置问题)

方案一
似乎不可行,因为,传输过程又是不安全的?公钥可能会被调包

引入第三方机构

到上面这一步,最关键的问题是,客户端如何知道给我公钥的是黄蓉还是小龙女?只能找本人去证实?或者有一个第三者来帮你证实,并且第三者是绝对公正的。

所以,引入一个可信任的第三者是一个好的方案 服务端把需要传递给客户端的公钥,通过第三方机构提供的私钥对公钥内容进行加密后,再传递给客户端? 通过第三方机构私钥对服务端公钥加密以后的内容,就是一个简陋版本的“数字证书”。这个帧数中包含【服务器公钥】

客户端拿到这个证书以后,因为证书是第三方机构使用私钥加密的。客户端必须要有第三方机构提供的公钥才能解密证书。这块又涉及到第三方机构的公钥怎么传输?(假设是先内置在系统中)以及还有一个问题,第三方机构颁发的证书是面向所有用户,不会只针对一家发放。如果不法分子也去申请一个证书呢?

如果不法分子也拿到证书?

如果不法分子也申请了证书,那它可以对证书进行调包。客户端在这种情况下是无法分辨出收到的是你的证书,还是中间人的。因为不论是中间人的、还是你的证书

都能使用第三方机构的公钥进行解密。

验证证书的有效性

事情发展到现在,问题演变成了,客户端如何识别证书的真伪?在现实生活中,要验证一个东西的真伪,绝大部分都是基于编号去验证(比如大学毕业证书,比如买的数码产品是否是山寨),我之前讲过,计算机领域的解决方案都是人为去实现的,所以在这里,解决方案也是一样,如果给这个数字证书添加一个证书编号?是不是就能达到目的呢?

证书上写了如何根据证书的内容生成证书编号。客户端拿到证书后根据证书上的方法自己生成一个证书编号,如果生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的。这块有点类似于md5的验证,我们下载一个软件包,都会提供一个md5的值,我们可以拿到这个软件包以后通过一个第三方软件去生成一个md5值去做比较,是不是一样如果一样表示这个软件包没被篡改过

对服务端的数据进行MD5算法得到一个MD5的值,生成证书编号,使用第三方机构的私钥对这个证书编号进行加密,并且会在证书中添加证书编号的生成算法

浏览器内置的CA公钥可以解密服务端CA私钥加密的证书,通过浏览器内置的CA证书的证书编号算法对服务端返回的证书编号进行验签

第三方机构的公钥证书存哪里?

浏览器和操作系统都会维护一个权威的第三方机构列表(包括他们的公钥)

因为客户端接收到的证书中会些颁发机构,客户端就根据这个办法机构的值在本地找到响应的公钥 
说到这里,我想大家一定知道,证书就是HTTPS中的数字证书,证书编号就是数字签名,而第三方机构就是数字证书的签发机构(CA)

逆向推导https的设计过程相关推荐

  1. 需求与设计过程(1)-用例

    1.前言 看过太多的称得上"三无"的软件,就是无需求.无设计.无注释.严格的说来,他们的需求和设计其实还是有的,只是没有用文档记录下来而已,但是注释确实真的没有.这些软件从大到小都 ...

  2. CMDB经验分享之 – 剖析CMDB的设计过程

    作为IT管理的核心,CMDB逐渐成为系统管理项目实施的热点.在很多的案例中,由于忽视了CMDB的因素,ITIL的深入应用受到了极大的挑战.同时,由于CMDB是IT管理信息的集中,CMDB也是一个重要的 ...

  3. 软件工程(总体设计①设计过程)

    经过需求分析(https://blog.csdn.net/weixin_45626468/article/details/115324885)阶段的工作,系统必选"做什么"已经清楚 ...

  4. 电源模块设计过程(降压、正压转负压)-MC34063

    MC34063是一款非常好用的电源模块,能够实现降压.正压转负压等多种功能.比较好用,下面就来介绍它的设计过程: 参考:https://www.ti.com.cn/cn/lit/ds/symlink/ ...

  5. 《安富莱嵌入式周报》第266期:真正模拟DA神的威力,全开源nV级测量仪表挑战赛结束,欣赏震撼设计过程

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  6. unity获取麦克风音量_深入探究Valve Index的耳机、麦克风设计过程

    查看引用/信息源请点击:映维网 本文来自于Valve音频工程师艾米莉·丽琪维 (映维网 2019年08月13日)继深入介绍了Index头显的视场之后,Valve日前撰文探究了设备耳机和麦克风方面的设计 ...

  7. 企业视觉识别系统(vi)的设计过程

    企业视觉识别系统(vi)的设计过程 编辑:AGO(安可)品牌顾问 企业视觉识别系统(vi)的设计过程与理念识别系统(bi)的设计过程类似,都要经过调查.定位.筛选.定稿等过程.企业vi设计时,应该先有 ...

  8. 界面设计过程中的常用字体规范

    好长时间没发帖,净想过年了,过年哈,倒腾工作总结和年货是大事. 这几天有人问我说:"最近看了好多教程,都老高大上了,但是老弟我做不到呀,想学点直接能拿来用的,这个要求过分吗--" ...

  9. 打开潘多拉的魔盒——软件设计过程(1)——序

    小序 <打开潘多拉的魔盒>--这是一系列文章,这些文章并不是真的要讲述潘多拉 MM 打开魔盒的故事.这些是技术文章,是要通过真实的案例来讲述软件系统的设计过程.本文中所采用的真实案例是网页 ...

最新文章

  1. 2022-2028年中国塑料导爆管行业市场调查研究及前瞻分析报告
  2. Space X的火箭上天,Tesla的业绩落地
  3. Apache软件历史版本下载地址
  4. onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!
  5. 什么?Spring Boot CommandLineRunner 有坑!?
  6. SanFengClound
  7. bring your mac everywhere you go
  8. js模块化:默认导出 export default
  9. 走进JVM之一 自己编译openjdk源码
  10. 使用kettle导入数据到ADB for PostgreSQL
  11. 虚拟函数-1、静态联编与动态联编,引入虚函数
  12. ENVI5.3.1使用Landsat 8影像进行典型地物光谱简单分析实例操作
  13. Atitit node.js的缺点 优缺点 和php比较 1. 门槛比较 php简单,node麻烦 1 1.1. php的优势是语法简单易学,学习曲线平滑度可能居所有语言之首 2 1.2. 当用N
  14. QQ空间权限限制破解思路
  15. 【C++】 C++入门和基础
  16. java 读取换行_Java中的换行字符读取 - java
  17. MATLAB中isempty函数的用法
  18. 关于java外文翻译_毕业论文外文翻译-Java和因特网
  19. 为什么mysql填不了数据库_求助,为何我的数据不能写入数据库
  20. wpsjs插件开发-采用js和wps交互功能

热门文章

  1. vue生命周期大白话篇
  2. Javascript-自己定义对象转换成JSon后怎样再转换回自己定义对象
  3. 《SaltStack技术入门与实践》—— Job管理
  4. 一条代码解决各种IE浏览器兼容性问题
  5. java获取URL参数(get方式,并且你不知道他末尾有什么参数名)
  6. Genymotion中文手册
  7. 【大话hibernate】hibernate系统学习大合集
  8. Bootstrap3基础 input-group-btn 按钮与输入框 横向组合
  9. SpringBoot-AOP切面处理
  10. 《构建实时机器学习系统》一1.8 实时机器学习模型的生存期