传输层安全
在传输层之上实现数据的安全传输是另一种安全解决方案。一般SSL都是可执行协议软件包的一部分,从而对应用是透明的,可以也。嵌入到特殊软件包中(IE浏览器都配置了SSL)。
SSL / TLS协议
1994年Netscape开发了安全套接层协议SSL(安全套接字层),专门用于保护Web通讯
版本和历史
- 1.0,不成熟
- 2.0,基本上解决了网络通讯的安全问题
Microsoft公司发布了PCT(私人通信技术),并在IE中支持
- 3。0,1996年发布,增加了一些算法,修改了一些缺陷
- IETF内部成立传输层安全(TLS)工作组制定通用标准时,达成一致选择SSL.TLS 1.0(传输层安全性,也被称为SSL 3.1),1997年IETF发布草案,同时,Microsoft宣布放弃PCT,与Netscape一起支持TLS 1.0。1999年正式发布RFC 2246(The TLS Protocol v1.0)。
协议的设计目标
- 为两个通讯个体之间提供保密性和完整性(身份认证)
- 考虑互操作性,可扩展性,相对效率等
SSL体系结构
SSL协议的目标就是在通信双方利用加密的SSL信道建立安全的连接。它不是一个单独的协议,而是两层协议
- 一次会话从握手开始,协商双方**等参数信息;
- 握手完成时用密码变更规则协议发送密码变更规格消息;
- 利用开始记录协议封装应用数据进行通信;
- 通信中出现错误时,利用报警协议进行协调。
SSL两个主要的协议
SSL记录协议
- 建立在可靠的传输协议(如TCP)之上
- 它提供连接安全性,有两个特点
保密性,使用了对称加密算法
完整性,使用HMAC算法
- 用来封装高层的协议
SSL握手协议
- 客户和服务器之间相互鉴别
- 协商加密算法和**
- 它提供连接安全性,有三个特点
身份鉴别,至少对一方实现鉴别,也可以是双向鉴别
协商得到的共享**是安全的,中间人不能够知道
协商过程是可靠的
1)SSL记录协议
①fragmentation
- 上层消息的数据被分片成214字节大小的块,或者更小
②compression(可选) - 必须是无损压缩。有时候数据量很少,压缩反而会增加数据,则增加部分的长度不超过1024字节
③MAC计算:
④加密
可供选择的加密算法
IDEA 128 RC-40 40
RC2-40 40 RC4-128 128
DES-40 40
DES 56
3DES 168
福尔泰扎80
⑤最后添加SSL控制头
SSL记录格式
- ContentType-- 8位,上层协议类型【4种】:密码变更规格,报警,握手,应用数据
- 主要版本Minnor版本 - 16位,主次版本
- 压缩长度:16位 - 加密后数据的长度,不超过2 ^ 14 + 2048字节
- EncryptedData片段; - 密文数据
SSL的有效载荷 - 封装的数据
有效载荷-即SSL里记录封装的上层数据有【4种】
①ChangeCipherSpec
只有1字节,值为1.用以将握手时的延迟状态转至当前状态,更新了在当前连接上的密码机制。
②Alert
2字节第一个字节表明报警的等级(1 - 警告; 2 - 致命的);第二个字节则是具体警告的编码。
③handshake
1字节(握手消息的类型)3字节(握手消息的长度)+ N字节(本条握手消息的相关参数)
④应用数据
上层应用数据
2)SSL握手协议
SSL握手协议在记录协议之上,记录协议是一种保密的数据封装,而记录协议加密用的**来自握手协议。
SSL握手消息是明文还是密文?
SSL握手消息前期是明文,握手协商过程中逐渐变为密文.SSL记录协议有了**后才能开始密文封装。
握手协议使用的消息
|
消息 |
参数 |
|
hello_request |
空值 |
|
CLIENT_HELLO |
版本,随机数,会话ID,密码参数,压缩方法 |
|
server_hello |
|
|
证书 |
X.509 v3证书链 |
|
server_key_exchange |
参数,签名 |
|
certificate_request |
类型,CA的 |
|
server_done |
空值 |
|
certificate_verify |
签名 |
|
客户端** |
参数,签名 |
|
完 |
哈希值 |
SSL握手协议的流程
第一阶段:建立起安全协商
①客户发送一个CLIENT_HELLO消息:
- 版本(版本):客户端SSL最高版本
- 随机数(随机):32位时间戳28字节随机序列
- 会话ID(会话ID):一个会话状态对应一组参数
- 密码构件(CipherSuite):客户支持的密码算法列表,包括**交换算法和密码算法等。以优先选用递减顺序给出。
- 压缩方法(Compression Mehod):客户支持的压缩方法表然后,客户等待服务器的server_hello消息
②服务器发送server_hello消息:
包括客户建议的低版本以及服务器支持的最高版本,服务器产生的随机数,会话ID,**构件域,压缩域
- **构建域(服务器从客户建议的密码算法中挑出一套,包括包以下内容)
①**交换方法:RSA,固定/暂态/匿名的Diffie-Hellman,以及福尔泰扎方法
②CipherSpec:密码算法,MAC算法,密码类型(流/分组),可否出口,散列码大小,**材料(用于产生写**的数据),IV大小
- 压缩域包括
(服务器从客户建议的压缩方法中挑出一个)
第二阶段:服务器鉴别和**交换
- 以服务器发送自己的证书为标志,开始第二阶段,该消息包含一个X.509证书,或者一条证书链(可选的,除匿名的Diffie-Hellman交换之外的**交换方法都需要证书)
- 服务器发送server_key_exchange消息消息包含签名,被签名的内容包括两个随机数以及服务器参数。可选的,只有当服务器的证书没有包含必需的数据的时候才发送此消息
- 服务器发送certificate_request消息 - 可选的,非匿名服务器可以向客户请求一个证书 - 包含证书类型和Cas(可接收的认证机构名称列表)
- 服务器发送server_hello_done,然后等待应答
第三阶段:客户鉴别和**交换
- 客户收到server_done消息后,它根据需要检查服务器提供的证书,并判断server_hello的参数是否可以接受,如果都没有问题的话,发送一个或多个消息给服务器
- 如果服务器请求证书的话,则客户首先发送一个证书消息,若客户没有证书,则发送一个no_certificate警告
- 然后客户发送client_key_exchange消息,消息的内容取决于**交换的类型(若是RSA方式,客户端产生一个48字节的预备主**预先主**)
- 最后,若客户端证书具有签名功能,发送一个certificate_verify消息,该消息是对客户端启动CLIENT_HELLO后发送或接收到的所有握手协议消息填充MAC处理后进行的签名。
第四阶段:结束
- 第四阶段建立起一个安全的连接
- 客户发送一个change_cipher_spec(密码变更规格)消息,并把协商得到的密文拷贝到当前连接的状态之中
- 客户用新的算法,**参数发送一个完成消息,包括一个校验值,对所有握手以来的消息(不包括本消息)进行校验。该消息可以检查**交换和鉴别过程是否已经成功。
- 服务器同样发送change_cipher_spec消息和完成消息。
- 握手过程完成,客户和服务器可以交换应用层数据。
如何协商实现保密通信的
- 第一阶段,设CLIENT_HELLO给服务器提供的**交换方法有RSA方式:即用接收者公钥加***服务器也选择并回送server_hello。
- 第二阶段,服务器传递自己的证书(这以后就可以单方向加密了)
- 第三阶段,客户端的**交换消息中就可以用服务器的公钥将生成的**(预备主**KPRE)加密后发给服务器。(至此,双方都掌握了一个密秘信息K.这以后就可双方加密)
- 第四阶段,发送密码规格变更消息,双方确认一下。
关于双方共享的**
- 加密,鉴别很多地方需要**和秘密初始向量等,一个秘密KPRE是不够的。
- 第三阶段双方都知道KPRE后,各自会根据KPRE利用SSL设定的算法计算得到主**。然后按顺序从主**生成客户端写MAC**,服务器写MAC**,客户端写**,服务器端写**,客户端写初始向量IV,服务器端写初始向量IV。
思考整个过程
一次会话从握手开始,协商双方**等参数信息;
握手完成时用密码变更规则协议发送密码变更规格消息(双方都把会话,链接相关的参数存储在合适的位置);
开始利用记录协议封装应用数据进行通信;
通信中出现错误时,利用报警协议进行协调。
SSL的两个重要概念
SSL会话(会话)
- 一个SSL会话是在客户与服务器之间的一个关联。会话由SSL握手协议创建。会话定义了一组可供多个连接共享的密码安全参数
- 会话用以避免为每一个连接提供新的安全参数所需昂贵的协商代价。
SSL连接(连接)
- 一个连接是一个提供一种合适类型服务的传输(OSI分层的定义)。
- SSL的连接是点对点的关系。
- 连接是暂时的,每一个连接和一个会话关联。
SSL会话
SSL会话由握手协议创建,定义了一系列相应的安全参数,最终建立客户机和服务器之间的一个关联。对于每个SSL连接,可利用SSL会话避免对新的安全参数进行代码繁多协商。
。每个SSL会话都有许多与之相关的状态一旦建立了会话,就有一个当前操作状态.SSL会话状态参数包括:
(1)会话标志符(Session Identifier)用来确定活动或可回复的会话状态;
(2)对等实体证书(Peer Certificate),是对等实体X.509 v3证书;
(3)压缩方法(Compression Method);
(4)加密规范(Cipher Spec)包括加密算法DES,3DES和IDEA等,消息摘要算法MD5和SHA-1等,以及相关参数;
(5)主密码(Master Secret),由客户机和服务器共享的密码;
(6)是否可恢复(可恢复)会话是否可用于初始化新连接的标志。
SSL连接
SSL连接是一个双向连接,每个连接都和一个SSL会话相关.SSL连接成功后,可以进行安全保密通信.SSL连接状态的参数包括7个:
(1)服务器和客户机随机数(Server and Client Random):Server和Client为每一个连接所选择的字节序列。
(2)服务器写MAC秘密(Server Write MAC Secret):一个**,用来对服务器送出的数据进行MAC操作。
(3)客户机写MAC秘密(Client Write MAC Secret):一个**,用来对客户送出的数据进行MAC操作。
(4)服务器写**(Server Write Key):用于服务器进行数据加密,客户端进行数据解密的对称保***。
(5)客户机写**(Client Write Key):用于客户进行数据加密,服务器进行数据解密的对称保***;
(6)初始化向量(Initialization Vectors):当数据加密采用CBC方式时,每一个**保持一个IV。该字段首先由SSL握手协议,以后保留每次最后的密文数据块作为IV。
(7)***(***):每一方为每一个连接的数据发送与接收维护单独的顺序号。当一方发送或接收一个改变的密码规范消息时,序号置为0,最大264-1
对SSL攻击的启示
历史上有不少针对SSL的攻击,有的并不是SSL协议本身的缺陷,而是实现上导致的缺陷,一些启示:
- 随机数对于安全协议或者安全系统的重要性
- 对待错误消息如何响应Contiune?
会不会招致DOS?返回精确的错误容易被分析
- 为防止明文模式被分析,可进行随机数填充
OpenSSL - 开发自己的支持SSL的应用
目前实现SSL / TLS的软件虽然不多,但都很优秀。除了SSL标准提出者网景实现的,OpenSSL的是一个非常优秀的实现SSL / TLS的开放源代码软件包,主要是作为提供SSL算法的函数库供其他软件调用而出现的,可给任何TCP / IP应用提供SSL功能。
1995年,Eric A. Young和Tim J. Hudson开始开发OpenSSL,后来不断发展更新,直到现在,SSL还在不断的修改和完善,新版本也不断的推出。最新的版本可以从OpenSSL的官方网站http ://www.openssl.org下载。