1.SSL整体框图
SSL协议是应用层次(http协议)和TCP层级的一个可选的位置,可以从下面的图中非常清楚看到该层次:

绿色的框图就是这个SSL./TLS的位置,最右面的SSL/TLS图可以进一步的抽象为下面的图:

SSL Record Protocol: 记录协议,给上层的各种协议提供一些方法支撑。
SSL Handshake Protocol: 握手协议,在普通的socket的TCP/IP的三次握手的前提之上,又加了SSL的四次握手的过程。
SSL Change Cipher Spec Protocol:密码套件规范交换协议,在SSL握手的最后一步,使用这个协议。
SSL Alert Protocol:警告协议,当SSL握手或者传输过程中,出现错误的时候,使用这个协议。

上述的四个协议,梯次配合,共同给TCP/IP上了一把安全锁。

2.握手协议概述

SSL的握手协议在以前的文章中重点分析过,一共分为四个过程:

第一阶段:双方互相hello,展示出双方支持的密钥支持等一些限制信息。
第二阶段:服务器端推动证书,服务器端根据策略选择的加密策略,证书请求(如果是双向认证的话),serverHelloDone消息;
第三阶段:客户端接收证书,基于策略确实服务器的加密策略,证书校验(一些耗时的delegate操作,如CRL),证书发送*(如果双向认证);
第四阶段:客户端和服务器端,进行密钥规范交换协议,并将加密解密等算法套件设置到通道中(实际上这一步后SSLSession就生成了);
四个阶段完成后,整个SSL通道成功建立,到这一步为止,双方就可以利用SSL通道的机制,进行传输数据了,再传输的数据的过程中,会用到记录协议,这个后面会详细的讲解。

因为前面的文章已经重点分析过,这里只针对握手协议中比较重要的几个点进行再次强调一下:

a.密码套件的支持
我们在tomcat调试的源码的过程中,发现其SSL提供的密码套件有一个固定的格式,如下面的格式:

Tomcat默认支持了160多种格式,这些字段是通过_来进行分割的:


b.重用一个SSL会话
其次,上面已经提到了SSLSession,在SUN的JSSE的包中,已经抽象了这个SSLSession,它的实现内容就在SUN的包中。
与其对应的是SSLConnection,这个在JSSE包中对应的就是HttpsConnection。
多个HttpsConnection可以共享一个SSLSession,而这个重用的过程就是共享一个会话。
我们来看看基于这种重用,究竟会省略掉握手协议的哪一个部分:

通过上图,可以发现,握手协议中比较重要,并且比较耗时的密码协商,发送的证书,甚至客户端最耗时的delegate(CRL校验)等全部没有了,双发直接来回一个hello。、
在hello信息中,其中的一位就是SessionID的信息:

以上述的C语言的实现为例,当这个id为空的时候,说明肯定是一个新会话,如果这个id已经有值了,那么就会走上述的这样的一个流程。

3.密码交换协议

密码交换协议主要用于握手协议的最后一步中,其实这个协议的数据包就是一个字节:

主要的作用就是告知服务器端和客户端,双方密码套件已经设置到通道中了(实际上这个时候SSLSession就已经建立了,可以通过SSLSession拿到密码套件了)。
这个相当于一个标识为,告知下一步双方可以发送数据了,这条消息会改变双方的读写模式,为正式进入下一个SSL传输的阶段打好前哨。

4.警告协议

警告协议也很好理解,当SSL交互的过程中出现问题的时候,会调用这个协议,对双方进行通知,SSLSession,SSLConnection的断开等等操作,这个规范就是警告协议。

可以看到的是,警告协议也就是2个标识位,多了一个。
第一个标识位是level,和咱们在业务中定义的log4j的日志非常的像;
第二个是alert消息,这个alert消息按理来说,应该是任意多的byte的,但是由于字节的限制,仅仅就是1个byte就搞定了,那么这里面需要预定义一些消息:


当SSL出现问题的时候,双方交互的告警消息就是按照这个格式来做的,这也就构成了告警协议。

5.记录协议

从前面的框图来看,其实记录协议是一个底层的协议。
记录协议的触发是在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,开始进行传入阶段,即进入记录协议。
记录协议向连接提供两个服务:

  (1)保密性:使用握手协议定义的秘密密钥实现

  (2)完整性:握手协议定义了MAC,用于保证消息完整性、

我们分解一下在SSL信道建立后,传输一个数据包,内容为abcdefghi,它并不会在信道中直接传abcdefghi,而是会进行下面的好几道的工序的组装:

第一步、fragmentation(分段)

记录层将上层数据分为小于214字节大小的块,或者更小。由于记录层是多层结构,因此不同的TLS记录层内容类型的数据可能会交错。

第二步、compression(压缩){可选}

当前连接会话中如果定义了压缩算法,则需要对片段进行压缩。压缩必须为无损压缩,不能将内容长度增加超过1024字节。

第三步、计算消息认证码(MAC)

根据RFC2104定义的HMAC算法(TLS1.2改为HMAC-SHA256),计算出MAC值。并将其添加在(压缩后)分段的片段后。

第四步、encryption(加密)

采用CBC模式,然后根据握手阶段cipher spec指定的算法对分段块进行加密。

什么是CBC模式?

密码分组链接(CBC,Cipher-block
chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。解决后一个问题的一种方法是利用密文窃取。

注意在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它平文的内容。

第五步、添加SSL记录头

消息头包括上层协议类型、主次版本以及加密后密文以及MAC的长度。也就是SSL的服务器和客户端两端交互消息的格式,其实都是用这个记录协议进行封装的。

从记录协议可以看出,SSL信道的传输的数据也是极难被破解的。

6.TLS协议改进
a.TLS与SSL的差异
  1. 版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。
  2. 报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。
  3. 伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。
  4. 报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。
  5. 密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。
  6. certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。
  7. 加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。
  8. 填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。

b.TLS的主要增强内容

TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,提供了以下增强内容:

  1. 更安全的MAC算法
  2. 更严密的警报
  3. “灰色区域”规范的更明确的定义

c.TLS对于安全性的改进

  1. 对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用的(消息认证代码)MAC 功能更安全。
  2. 增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
  3. 改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。
  4. 一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。
  5. 特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。





h.SSL协议栈整体分解的更多相关文章

  1. 蓝牙 BLE 协议学习: 001-BLE协议栈整体架构

    背景 在深入BLE协议帧之前,我们先看一下BLE协议栈整体架构. 转载自:<深入浅出低功耗蓝牙(BLE)协议栈> 架构 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片, ...

  2. 几种开源SIP协议栈对比OPAL,VOCAL,sipX,ReSIProcate,oSIP

    随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进 的H.323协议栈展现在普通程序员的眼前,为H.323 ...

  3. 深入浅出低功耗蓝牙(BLE)协议栈

    深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...

  4. pku1365 Prime Land (数论,合数分解模板)

    题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...

  5. SSL - 简介

    一.密码技术 要了解SSL协议,首先要了解:加密算法.消息摘要算法(又称为哈希算法Hash),数字签名等概念.这些技术每个都可以写出一整本的书,它们结合在一起,提供了保密性.完整性和身份验证的功能. ...

  6. 几个重要的开源视频会议SIP协议栈

    视频会议系统由于需要与不同的终端进行连接,因此我们需要视频会议终端遵循统一的协议,H.323协议是视频会议软件使用最广泛的协议栈,但H.323设计得较为复杂,用户在调用H.323协议过程较多,因此利用 ...

  7. 几种开源SIP协议栈对比

    几种开源SIP协议栈对比 随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进的H.323协议栈展现在普通程 ...

  8. 每天进步一点点------H.264学习 (一)

    分三个阶段学习1.第一个阶段: 学习H.264,首先要把最基本最必要的资料拿在手里.这些资料包括:标准文档+测试模型+经典文章,在本FTP中能找到.首先看 <H.264_MPEG-4 Part ...

  9. Burp Suite使用介绍

    Burp Suite使用介绍(一)  22人收藏 收藏 2014/05/01 19:54 | 小乐天 | 工具收集 | 占个座先 Getting Started Burp Suite 是用于攻击web ...

随机推荐

  1. mvc 数据验证金钱格式decimal格式验证

    mvc 数据验证金钱格式decimal格式验证 首先看下代码 /// <summary> /// 产品单价 /// </summary> [Display(Name = &qu ...

  2. IE10,IE11下cookie无法写入问题

    asp.net 4.0的程序,发布后,测试在ie6,ie7,ie8,ie9下均可以正常登录,但是在ie10,ie11下就是无法保存cookie,排查了一下是否ie10,ie11是否存在设置问题发下并不 ...

  3. 在LaTeX文档中插入图片的几种常用的方法

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...

  4. 自动插入数据sql

    oracle自动插入一定大小的数据: create tablespace TABLESPACE datafile 'E:\TABLESPACE.dbf' size 10g autoextend on ...

  5. JS获取当前时间并把时间赋给input表单

    <script>window.onload = function(){ function getDate(){ debugger; var today = new Date(); var ...

  6. javascript中的自增与自减

    一直都对自增与自减的执行顺序有点糊涂,今天查了资料,来总结一下 a++(a--),就是指当时计算a,当下一次使用这个变量的时候才执行++或者-- ++a(--a),就是指当时就计算++或者-- 例1: ...

  7. [Effective JavaScript 笔记]第7章:并发--个人总结

    前言 这一章的内容学到了事件队列和异步的API.js只是运行在其他应用程序的脚本语言.js即依赖于应用程序,也独立与应用程序.可以使它可以在多平台,多种环境上运行.ECMAScript标准中没有关于并 ...

  8. [5] 智能指针boost::shared_ptr

    [1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_p ...

  9. 卸载cygwin

    1.下载takeown.exe(貌似win自带,你可以打开cmd 输入takeown.exe查看,貌似不行)所以还是去网上下载吧,亲测http://download.csdn.net/download ...

  10. logback.xml日志配置

    日志先行,日志是程序员的眼睛 控制台输出 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAp ...