您现在的位置是:首页 > 正文

图解SSL/TLS协议

2024-04-01 03:18:22阅读 0

一、SSL协议的握手过程

开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。

假定客户端叫做爱丽丝,服务器叫做鲍勃,整个握手过程可以用下图说明(点击看大图)。

握手阶段分成五步。

第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。

第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。

第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。

第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。

第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。

上面的五步,画成一张图,就是下面这样。

二、私钥的作用

握手阶段有三点需要注意。

(1)生成对话密钥一共需要三个随机数。

(2)握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),无其他作用。

(3)服务器公钥放在服务器的数字证书之中。

从上面第二点可知,整个对话过程中(握手阶段和其后的对话),服务器的公钥和私钥只需要用到一次。这就是CloudFlare能够提供Keyless服务的根本原因。

某些客户(比如银行)想要使用外部CDN,加快自家网站的访问速度,但是出于安全考虑,不能把私钥交给CDN服务商。这时,完全可以把私钥留在自家服务器,只用来解密对话密钥,其他步骤都让CDN服务商去完成。

上图中,银行的服务器只参与第四步,后面的对话都不再会用到私钥了。

三、DH算法的握手阶段

整个握手阶段都不加密(也没法加密),都是明文的。因此,如果有人窃听通信,他可以知道双方选择的加密方法,以及三个随机数中的两个。整个通话的安全,只取决于第三个随机数(Premaster secret)能不能被破解。

虽然理论上,只要服务器的公钥足够长(比如2048位),那么Premaster secret可以保证不被破解。但是为了足够安全,我们可以考虑把握手阶段的算法从默认的RSA算法,改为 Diffie-Hellman算法(简称DH算法)。

采用DH算法后,Premaster secret不需要传递,双方只要交换各自的参数,就可以算出这个随机数。

上图中,第三步和第四步由传递Premaster secret变成了传递DH算法所需的参数,然后双方各自算出Premaster secret。这样就提高了安全性。

四、session的恢复

握手阶段用来建立SSL连接。如果出于某种原因,对话中断,就需要重新握手。

这时有两种方法可以恢复原来的session:一种叫做session ID,另一种叫做session ticket。

session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。

上图中,客户端给出session ID,服务器确认该编号存在,双方就不再进行握手阶段剩余的步骤,而直接用已有的对话密钥进行加密通信。

session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。

上图中,客户端不再发送session ID,而是发送一个服务器在上一次对话中发送过来的session ticket。这个session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到session ticket以后,解密后就不必重新生成对话密钥了。

转自:http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html?utm_source=tuicool&utm_medium=referral

 

转载于:https://www.cnblogs.com/coolYuan/p/8663067.html

网站文章

  • [转]Git与Github的使用(ubuntu)

     转自:http://www.pureweber.com/article/git-and-github/Git的简介Git是2005年Linus Torvalds 为了帮助管理 Linux(R) 内核开发而开发的一个开放源码的版本控制软件,正如所提供的文档中说的一样,”Git 是一个快速、可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。” ...

    2024-04-01 03:18:15
  • Android 动态加载资源

    Android 动态加载资源

    这里非常的关键,需要解释一下,首先AssetManager是资源管理器,专门负责加载资源的,它内部有个隐藏方法addAssetPath,是用于加载指定路径下的资源文件,也就是说你把apk/jar的路径...

    2024-04-01 03:18:08
  • 每日算法:矩阵篇(在行列都排好序的矩阵中找数、“之”字形打印矩阵、旋转正方形矩阵、转圈打印矩阵)

    每日算法:矩阵篇(在行列都排好序的矩阵中找数、“之”字形打印矩阵、旋转正方形矩阵、转圈打印矩阵)

    1、转圈打印矩阵【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 1415 16打印结果为:1,2,3,4,8,12,...

    2024-04-01 03:17:22
  • R语言泊松回归

    泊松回归涉及回归模型,其响应变量是计数形式而不是分数数字。 例如,计算出生人数或一个足球比赛系列中的胜率数。响应变量的值也遵循泊松分布。泊松回归的一般数学方程为 -log(y) = a + b1x1 + b2x2 + bnxn.....以下是使用的参数的描述 -y - 是响应变量。 a 和 b 是数字系数。 x - 是预测变量。用于创建泊松回归模型的函数是glm()函数。...

    2024-04-01 03:17:16
  • Zabbix配置邮件告警

    Zabbix配置邮件告警

    告警发送是监控系统的重要功能之一 , 在配置好触发器(Trigger),将告警表达式定义好后,我们需要设置规则,比如设置当告警发生后,是否需要发送告警,以及将什么样内容的告警发送给谁等。

    2024-04-01 03:17:09
  • Dart Map对象Interface接口的实现

    Dart Map对象Interface接口的实现, 指定Map对象里的键值对

    2024-04-01 03:16:24
  • 数据库——视图

    数据库——视图

    视图一、视图概念二、 为什么要使用视图三、 性能问题四、 定义视图五、 查看视图六、 删除视图一、视图概念视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实...

    2024-04-01 03:16:16
  • ZYNQ 安装ubuntu文件系统

    ZYNQ 安装ubuntu文件系统

    ZYNQ 7020 Ubuntu16.04文件系统安装 在关于zynq openamp的章节我们已经完成了zynq 的u-boot,内核,设备树的制作,通过XSDK完成了启动文件的创建。 同样道理制作...

    2024-04-01 03:16:09
  • 正则表达式

    正则表达式

    正则表达式可以更简单的进行数据合法性判断,介绍正则表达式的书写,匹配方法,案例实现,数据筛选

    2024-04-01 03:15:30
  • 【Python】多线程

    import threadingimport time class myThread (threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name): threading.Thread.__init__(self) self.name = na...

    2024-04-01 03:15:23