什么是SSL记录协议
SSL记录协议是通过将数据流分割成一系列的片段并加以传输来工作的,其中的每个片段都单独进行保护和传输。在传输数据片段之前,需要计算数据的MAC以保证数据的完整性。数据片段和MAC一起被加密并与头信息组成记录,记录是实际传输的内容。
SSL记录协议的两种服务
SSL记录协议为每一个SSL连接提供以下两种服务。
(1)机密性(Confidentiality):SSL记录协议会协助双方产生一把共有的密钥,利用这把密钥来对SSL所传送的数据做传统式加密。
(2)消息完整性(Message Integrity):SSL记录协议会协助双方产生另一把共有的密钥,利用这把密钥来计算出消息认证码。
下图展示了SSL记录协议大致的操作流程。记录协议接收到应用程序所要传送的消息后,会将消息内的数据切成容易管理的小区块(分片),然后选择是否对这些区块作压缩,再加上此区块的消息认证码。接着将数据区块与MAC一起做加密处理,加上SSL记录头后通过TCP传送出去。接收数据的那一方则以解释、核查、解压缩,及重组的步骤将消息的内容还原,传送给上层使用者。
第一个步骤是分片(Fragmentation)。每一个上层想要通过SSL传送的消息都会被切割成最多214B(或者是16364B)大小的分片,接着,可以选择是否执行压缩(Compression)的步骤。压缩的过程中,必须是无损失(Lossless)压缩,也就是说解压缩后能够得到原本完整的消息。除此之外,经过压缩后的内容长度不能超过原有长度1024字节以上(当然,我们希望压缩后的数据能够更小,而不是增多。但对于有些长度非常小的分片来说,可能因为压缩算法格式上的要求,压缩过后的结果会比原来数据还长)。在SSLv3(以及TLS的现有版本),并没有指定压缩算法,所以预设的加算法是null。
接下来的处理步骤为计算压缩数据的消息认证码。为了达到这个目的,必须使用一把双方共有的密钥。消息认证码的计算过程定义如下:
hash(MAC_write_secrte||pad_1||seq_mum||SSLCompressed.type||SSLCompressed.length||SSLCompressed.fragment),其中,各符号和参数的意义如下。
(1)||:表示串接。
(2)MAC_write_secrte:共有的密钥。
(3)Hash:使用到密码的杂凑算法;MD5或者SHA-1。
(4)pad_1:若是使用MD5,则为0x36(00110110)字节重复48次的384位分片,若是用SHA-1,则为0x36重复40次的320位分片。
(5)pad_2:若是使用MD5,则为0x5C(01010110)字节重复48次的384位分片,若是用SHA-1,则为0x36重复40次的320位分片。
(6)seq_mum:这个消息的序列号码。
(7)SSLCompressed.type:用来处理这个分片的上层协议。
(8)SSLCompressed.length:分片经过压缩过后的长度。
(9)SSLCompressed.fragment:经过压缩后的分片(假如没有经过压缩这个步骤,则代表明文分片)。
接着,压缩过后的数据会连同MAC一起做对称加密。加密后的数据长度最多只能比加密前多1024B,因此,连同压缩以及加密的过程处理完后,整个数据块长度不会超过(214+2048)B。
SSL记录协议最后的步骤便是准备一个记录头,这个记录头包含以下的字段。
(1)数据类型(Content type),8位:用来处理这个分片的上层协议。
(2)主要版本号(Major Version),8位:所使用的SSI。协议的主要版本,对于SSI。v3协议来说,这个字段值为3。
(3)次要版本号(Minor Version),8位:表示使用的次要版本,对于SSLv3协议来说,这个字段值为0。
(4)压缩后数据长度(Compressed length),16位:这个明文分片的长度(假如此分片已经过压缩,则为压缩后的长度)。最大值为(214+2048)B。
已定义的数据类型包含Change_cipher_spec、alert、handshake,以及application_data。前三种数据类型为SSL所定义的协议。请注意,上层各种使用SSI。的应用程序对于SSL来说并没有什么差别,因为SSI。无法了解这些应用程序所产生的数据的意义。