SSL安全协议【精编版】
- 格式:doc
- 大小:564.50 KB
- 文档页数:72
SSL安全协议【精编版】SSL协议Version 3.0 3/4/96翻译—隋立颖一本文件的地位本文件是一个Internet草案。
Internet草案是Internet工程特遣组(ITEF)及其领域和工作组的工作文件。
请注意,其他团体也可以发布Internet草案。
Internet草案自公布之日起至多六个月内有效。
它可以随时被修改、被替换,或被其他文件所覆盖。
把Internet草案作为文献来引用,除说明是“正在进展中的工作”以外,是不合适的。
要了解任何一个Internet的当前地位,请查阅如下网址:(美国东海岸), (欧洲),(美国东海岸)以及munnari.oz.au(环太平洋地区)。
其中Internet Drafts Shadow Directories目录下的1id-abstract.txt列表可提供这方面的信息。
二摘要本文制定了安全套接层协议第3.0版(SSL3.0)规范。
SSL是一个提供Internet上的通信隐私性的安全协议。
该协议允许客户端/服务器应用之间进行防窃听、消息篡改及消息伪造的安全的通讯。
三简介制定SSL协议的初衷是为通讯双方提供安全可靠的通讯服务,协议包含两个层次:其较低的SSL记录层协议位于某一可靠的传输协议(例如TCP[TCP]协议)之上;SSL记录层协议用来对其上层的协议进行封装。
握手协议就在这些被封装的上层协议之中,它允许客户端和服务器彼此认证对方;并且在应用协议发出或收到第一个数据之前协商加密算法和加密密钥。
这样作的原因是保证了应用协议的独立性,使低级协议对高级协议是透明的。
SSL协议提供的连接安全性具有以下三条属性●连接是安全的。
在初始化握手协议协商加密密钥之后传输的消息均为加密的消息。
加密的算法为单钥加密算法(例如DES[DES], RC4[RC4]等)。
●对方的身份是可以通过非对称加密算法-即公钥加密算法(例如RSA[RSA], DSS[DSS]等)来验证。
●连接是可靠的。
所传输的消息均包含一利用签名私钥加密的消息文摘(MAC),以保证消息的完整性。
安全杂凑(hash)函数(例如SHA, MD5等)被用来产生消息文摘(MAC)。
四目标按它们的优先级,SSL协议3.0的目标是●在通讯双方之间利用加密的SSL消息建立安全的连接。
●互操作性。
通讯双方的程序是独立的,即一方可以在不知道对方程序编码的情况下利用SSL 3.0成功的交换加密参数。
注意:并不是所有的SSL的实例(甚至在同一应用程序内)都可以成功的连接。
例如,如果服务器支持一特定的硬件令牌(token),而客户端不能访问此令牌,则连接不会成功。
可扩展性。
SSL寻求提供一种框架结构,在此框架结构中,在不对协议进行大的修改的情况下,新的公钥算法和单钥算法可以在必要时被加入。
这样做还可以实现两个子目标1. 避免产生新协议的需要,因而进一步避免了产生新的不足的可能性。
2. 避免了实现一完整的安全协议的需要。
相对的有效性。
加密操作,尤其是公钥加密,对CPU来说是一种很耗时的事,因此SSL协议引入一可选的对话缓存(CACHE)来减少从头开始的连接的数目。
同时,它还注意减少网络的活动。
五此文档的目的SSL协议版本3.0详细说明书的主要读者是要实现此协议的人和进行加密分析的人。
此详细说明书主要是为这两类人而写的,所以它时刻注意反映这两类人的需要。
因此在本详细说明书中(而不是写在附录中)以文本方式包含了许多与算法相关的数据结构和规则,使它们易于被访问。
虽然本详细说明书包含了维护物理安全性所必须的策略,本详细说明书并不想提供关于服务和界面的定义。
六描述语言(Presentation language)本文档主要是描述外部表示(external representation)的数据的格式,所以用到了下列简单、基础而有点随意的定义的表示语法,这些语法在结构上来自不同的出处。
虽然这些语法在结构上有点象程序设计语言C、在语法和目标上象XDR[XDR],但过分的强调这种类似是有害的。
本描述语言的目的仅仅是描述SSL。
6.1 基本块长(Basic block size)所有的数据项的表示均是显式说明的,基本数据块的长度为一字节(也就是说8比特)多字节的数据项是由从上至下、从左至右的多个字节连接组成。
从字节流的角度来看,一多字节的数据项(在本例中是一数字)是通过下述公式形成的:value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | ... | byte[n-1];这种字节的顺序关系是网络中常用的顺序关系即大endian格式。
6.2 杂项注释以“/*”开始,以“*/”结束。
可选的部分是由将其包含进斜体的括号“[ ]”中而指定的。
单字节的包含不可解释的数据的实体的类型为opaque6.3 向量(Vectors)向量(一维数组)是一同类型的数据元素的流,向量的规模可以在编写文档时说明,也可以留至运行时才指明;不管在哪一种情况下,向量的规模(即大小)是由向量中字节的个数而不是向量中元素的个数决定的。
说明一新类型T’是一固定长度的类型T的向量的语法为:T T'[n];在这里,T’在数据流中占n比特,其中n是T的所占字节数的倍数。
向量中包含数据元素的个数没有包含在数据流之中。
在下例中,Datum被定义为三个连续的协议无法解释的字节的向量;而Data被定义为三个连续的Datum,一共包含9个字节opaque Datum[3]; /* 三个协议无法解释的字节*/Datum Data[9]; /* 三个连续的包含三个字节的向量*/可变长向量可以通过指明合法长度的范围,即形如<最小长度..最大长度>的形式来定义,在编码时,在字节流中实际长度应在向量的内容之前,此实际长度是以数字的形式存储的,此数字应能表示此向量的最大长度(ceiling length)。
空向量指的是一实际长度为零的向量。
T T'<floor..ceiling>;在下例中,mandatory是一必须包含300到400字节的opaque类型数据的向量,它不能是空向量,其实际长度域占有两个字节,即uint16,足以表示400(见6.4节),而longer最多能表示800个字节,即400个uint16的数据元素,且<请合法使用软件>可以是空向量。
它的编码包含一两字节的实际长度域。
opaque mandatory<300..400>; /* 长度域为两个字节,不能为空向量*/uint16 longer<0..800>; /* 零至400个16比特的无符号整数*/6.4 数字(Numbers)基本的数字的数据类型是无符号字节(uint8)。
其他所有的大的数字均是由6.1节中描述的固定长度的字节流连接而成,且它们均是无符号的。
下列数字类型是预定义的:uint8 uint16[2];uint8 uint24[3];uint8 uint32[4];uint8 uint64[8];6.5 枚举(Enumerate)另一类稀疏的数据类型是枚举(enum),枚举类型的数据的取值范围只能是在其定义是声明的值。
每一次定义均定义了一不同的类型。
只有相同类型的枚举数据才可以相互赋值和比较,枚举类型的每个枚举元素均必须象下例中所示的那样,被赋一个值。
由于枚举类型这的元素是没有顺序的,所以它们可以取任意顺序的不同的值。
enum { e1(v1), e2(v2), ... , e n(v n), [(n)] } T e;枚举类型的值在字节流中占据的空间的大小是其定义的取值范围中最大的可能值所占的空间大小。
下列定义会使类型Color占有一个字节。
enum { red(3), blue(5), white(7) } Color;你还可以通过指定一个无标签的值来强制枚举类型所占的字节数,这样就不需定义一冗余元素了。
在下例中,类型T aste在字节流中占两个字节但只能在1,2或4中取值。
enum { sweet(1), sour(2), bitter(4), (32000) } Taste;枚举类型的元素的名字只在定义的类型中是有效的。
在第一个例子中,对类型Color中的第二个元素的完全限定引用为Color.blue。
这样的限定当赋值的目标是被说明的时候时是可以忽略的。
Color color = Color.blue; /* 重复说明,但是合法的*/Color color = blue; /* 正确,类型是隐含的*/对于元素的值不会转化为外部表示的枚举类型,元素的取值信息是可以省略的。
enum { low, medium, high } Amount;6.6 结构(Constructed type)结构类型可以由基本的数据类型方便的建成,每一次说明均声明了一新的、唯一的类型,定义的语法类似于C语言中结构的定义。
struct {T1f1;T2f2 ;...T n f n;} [T];在一结构中的各域可以象枚举中引用元素时的语法一样用类型名加域名引用,例如T.f2引用的是上例中的第二个域,结构的定义可以嵌套。
6.6.1 变体结构(Variant)定义结构时可能根据环境的不同而有不同的变体,选择器必须为枚举类型的数据,以定义结构中可能的变体,且必须用case语句将select中声明的每个枚举元素不会起来。
变体结构的结构体可以有一供其引用的标签。
在运行时如何决定变体的机制并没有在描述语言中规定。
struct {T1f1;T2f2 ;...T n f n;select (E) {case e1 : T e1 ;case e2 : T e2 ;....case e n : T en ;} [f v];} [T v];例如:enum { apple, orange } VariantTag;struct {uint16 number;opaque string<0..10>; /* 可变的长度*/} V1;struct {uint32 number;opaque string[10]; /* 固定的长度*/} V2;struct {select (VariantTag) { /* 变体的选择器是隐含的*/case apple: V1; /*VariantBody的定义,标签= apple */case orange: V2; /*VariantBody的定义,标签= orange */} variant_body; /* 可选的变体标签*/} VariantRecord;变体结构可以通过在类型前指定选择器的值来限定(narrowed),例如:orange VariantRecord是类型VariantRecord的一限定,它包含类型为V2的variant_body。