一篇文章让你彻底弄懂SSL/TLS协议

SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码,消息认证码,公钥密码,数字签名,伪随机数生成器等,可以说是密码学中的集大成者。

SSL(Secure Socket Layer)安全套接层,是1994年由Netscape公司设计的一套协议,并与1995年发布了3.0版本。

TLS(Transport Layer Security)传输层安全是IETF在SSL3.0基础上设计的协议,实际上相当于SSL的后续版本。

SSL/TLS的应用

SSL/TLS是一个安全通信框架,上面可以承载HTTP协议或者SMTP/POP3协议等。

TLS协议的架构

TLS主要分为两层,底层的是TLS记录协议,主要负责使用对称密码对消息进行加密。

上层的是TLS握手协议,主要分为握手协议,密码规格变更协议和应用数据协议4个部分。

  • 握手协议负责在客户端和服务器端商定密码算法和共享密钥,包括证书认证,是4个协议中最最复杂的部分。

  • 密码规格变更协议负责向通信对象传达变更密码方式的信号

  • 警告协议负责在发生错误的时候将错误传达给对方

  • 应用数据协议负责将TLS承载的应用数据传达给通信对象的协议。

握手协议

握手协议是TLS协议中非常重要的协议,通过客户端和服务器端的交互,和共享一些必要信息,从而生成共享密钥和交互证书。

不说话,先上图:

接下来我们一步步的介绍每一步的含义:

  1. client hello

    客户端向服务器端发送一个client hello的消息,包含下面内容:

    • 可用版本号
    • 当前时间
    • 客户端随机数
    • 会话ID
    • 可用的密码套件清单
    • 可用的压缩方式清单

我们之前提到了TLS其实是一套加密框架,其中的有些组件其实是可以替换的,这里可用版本号,可用的密码套件清单,可用的压缩方式清单就是向服务器询问对方支持哪些服务。

客户端随机数是一个由客户端生成的随机数,用来生成对称密钥。

  1. server hello

    服务器端收到client hello消息后,会向客户端返回一个server hello消息,包含如下内容:

    • 使用的版本号
    • 当前时间
    • 服务器随机数
    • 会话ID
    • 使用的密码套件
    • 使用的压缩方式

使用的版本号,使用的密码套件,使用的压缩方式是对步骤1的回答。

服务器随机数是一个由服务器端生成的随机数,用来生成对称密钥。

  1. 可选步骤:certificate

    服务器端发送自己的证书清单,因为证书可能是层级结构的,所以处理服务器自己的证书之外,还需要发送为服务器签名的证书。

    客户端将会对服务器端的证书进行验证。如果是以匿名的方式通信则不需要证书。

  2. 可选步骤:ServerKeyExchange

    如果第三步的证书信息不足,则可以发送ServerKeyExchange用来构建加密通道。

    ServerKeyExchange的内容可能包含两种形式:

    • 如果选择的是RSA协议,那么传递的就是RSA构建公钥密码的参数(E,N)。我们回想一下RSA中构建公钥的公式:\(密文=明文^E\ mod\ N\), 只要知道了E和N,那么就知道了RSA的公钥,这里传递的就是E,N两个数字。具体内容可以参考RSA算法详解
    • 如果选择的是Diff-Hellman密钥交换协议,那么传递的就是密钥交换的参数,具体内容可以参考更加安全的密钥生成方法Diffie-Hellman
  3. 可选步骤:CertificateRequest

    如果是在一个受限访问的环境,比如fabric中,服务器端也需要向客户端索要证书。

    如果并不需要客户端认证,则不需要此步骤。

  4. server hello done

    服务器端发送server hello done的消息告诉客户端自己的消息结束了。

  5. 可选步骤:Certificate

    对步骤5的回应,客户端发送客户端证书给服务器

  6. ClientKeyExchange

    还是分两种情况:

    • 如果是公钥或者RSA模式情况下,客户端将根据客户端生成的随机数和服务器端生成的随机数,生成预备主密码,通过该公钥进行加密,返送给服务器端。
    • 如果使用的是Diff-Hellman密钥交换协议,则客户端会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。具体内容可以参考更加安全的密钥生成方法Diffie-Hellman,这样服务器端可以根据这个公开值计算出预备主密码。
  7. 可选步骤:CertificateVerify

    客户端向服务器端证明自己是客户端证书的持有者。

  8. ChangeCipherSpec(准备切换密码)

    ChangeCipherSpec是密码规格变更协议的消息,表示后面的消息将会以前面协商过的密钥进行加密。

  9. finished(握手协议结束)

    客户端告诉服务器端握手协议结束了。

  10. ChangeCipherSpec(准备切换密码)

    服务器端告诉客户端自己要切换密码了。

  11. finished(握手协议结束)

    服务器端告诉客户端,握手协议结束了。

  12. 切换到应用数据协议

    这之后服务器和客户端就是以加密的方式进行沟通了。

主密码和预备主密码

上面的步骤8生成了预备主密码,主密码是根据密码套件中定义的单向散列函数实现的伪随机数生成器+预备主密码+客户端随机数+服务器端随机数生成的。

主密码主要用来生成称密码的密钥,消息认证码的密钥和对称密码的CBC模式所使用的初始化向量。详见分组密码和模式

TLS记录协议

TLS记录协议主要负责消息的压缩,加密及数据的认证:

先上图。

消息首先将会被分段,然后压缩,再计算其消息验证码,然后使用对称密码进行加密,加密使用的是CBC模式,CBC模式的初始向量是通过主密码来生成的。

得到密文之后会附加类型,版本和长度等其他信息,最终组成最后的报文数据。

更多内容请访问 flydean的博客

一篇文章让你彻底弄懂SSL/TLS协议的更多相关文章

  1. 一篇文章让你彻底弄懂WinForm GDI 编程基本原理

    一 GDI编程原理 GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. GDI的常用 ...

  2. 一篇文章搞懂密码学基础及SSL/TLS协议

    SSL协议是现代网络通信中重要的一环,它提供了传输层上的数据安全.为了方便大家的理解,本文将先从加密学的基础知识入手,然后展开对SSL协议原理.流程以及一些重要的特性的详解,最后会扩展介绍一下国密SS ...

  3. SSL/TLS协议详解(下)——TLS握手协议

    本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...

  4. SSL/TLS协议工作流程

    我看了CloudFlare的说明(这里和这里),突然意识到这是绝好的例子,可以用来说明SSL/TLS协议的运行机制.它配有插图,很容易看懂. 下面,我就用这些图片作为例子,配合我半年前写的<SS ...

  5. 图解SSL/TLS协议(HTTPS的安全层)

    http://blog.csdn.net/wallezhe/article/details/50977337 图解SSL/TLS协议     作者: 阮一峰 日期: 2014年9月20日 本周,Clo ...

  6. 图解SSL/TLS协议

    本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...

  7. 图解SSL/TLS协议(转)

    本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...

  8. [转帖]图解SSL/TLS协议

    图解SSL/TLS协议   作者: 阮一峰 日期: 2014年9月20日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. http://www.ruanyifeng.com/bl ...

  9. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

随机推荐

  1. 1035 Password (20分)(水)

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  2. Python内置函数分类汇总

    Python解释器内置了很多函数,这些内置函数使用方便,无需导入,直接调用.可以在交互模式下输入dir(__builtins__),输出的列表中包含了所有的内置函数:   1.可迭代对象.序列操作相关 ...

  3. JVM 理解性学习(二)

    1.G1 垃圾回收器 G1 能更少的 "Stop the World" ,能同时对新生代老年代进行垃圾回收. G1 将 Java 堆内存拆分为多个大小相等的 Region,并且新生 ...

  4. 【公告】请访问我Blog新站——superman2014 www.superman2014.com

    http://www.superman2014.com 欢迎光顾 本博客不在更新!!!!

  5. pip 命令参数以及如何配置国内镜像源

    文章更新于:2020-04-05 注:如果 pip 命令不可以用,参见:python pip命令不能用 文章目录 一.参数详解 1.命令列表 2.通用参数列表 二.实际应用 1.常用命令 2.`pip ...

  6. java web数据库的增删改查详细

    本次课上实验是完成数据库的增删改查. 包括增加用户信息.删除用户信息.多条件查找用户信息.修改用户信息(主要是复选框单选框等的相关操作.) 下面下看一下各个界面的样子. 总页面:显示全部页面:增加页面 ...

  7. 微信号网页版api

    Django Wechat Api djangowechatapi是基于wxpy和django制作的web应用 安装 使用pip pip install djangowechatapi 源码安装 gi ...

  8. UC接口文档

    UC接口文档 一.功能描述 提供同步登录.退出.注册等相关接口,可以实现用户一个账号,在一处登录,全站通行. 二.测试环境UC地址 http://s1.p5w.net/uc/ 三.相关接口 UC_AP ...

  9. 【Canvas】(1)---概述+简单示例

    Canvas---概述+简单示例 如果通俗的去理解Canvas,我们可以去理解成它类似于我们电脑自带的画图工具一样,canvas首先是选择一块画布,然后在这个画布上描绘我们想画的东西,画好后展示给用户 ...

  10. 搭建环境-Eclipse配置Tomcat创建Servlet总结

    Descripton:Web开发:Eclipse的下载与安装,Tomcat下载和结合Eclipse的使用,Eclipse使用Servlet[记录下总结下] 一.Eclipse的下载与安装 下载地址 注 ...