SSL握手过程

原文地址: http://my.oschina.net/u/1188877/blog/164982

一、SSL握手有三个目的:
1. 客户端与服务器需要就一组用于保护数据的算法达成一致;
2. 它们需要确立一组由那些算法所使用的加密密钥;
3. 握手还可以选择对客户端进行认证。

二、SSL握手过程:
1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;
2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
3. 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加/解密),并将加密后的信息发送给服务器;
4. 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和MAC密钥(参考DH密钥交换算法)。
5. 客户端将所有握手消息的MAC值发送给服务器;
6. 服务器将所有握手消息的MAC值发送给客户端。

    第5与第6步用以防止握手本身遭受篡改。设想一个攻击者想要控制客户端与服务器所使用的算法。客户端提供多种算法的情况相当常见,某些强度弱而某些强度强,以便能够与仅支持弱强度算法的服务器进行通信。攻击者可以删除客户端在第1步所提供的所有高强度算法,于是就迫使服务器选择一种弱强度的算法。第5步与第6步的MAC交换就能阻止这种攻击,因为客户端的MAC是根据原始消息计算得出的,而服务器的MAC是根据攻击者修改过的消息计算得出的,这样经过检查就会发现不匹配。由于客户端与服务器所提供的随机数为密钥产生过程的输入,所以握手不会受到重放攻击的影响。这些消息是首个在新的加密算法与密钥下加密的消息。

    刚才所描述的每一步都需要通过一条或多条握手消息来实现。在此先简要地描述哪些消息与哪几步相对应,然后详细描述每条消息的内容。下图描述了各条消息:

    第1步对应一条单一的握手消息,ClientHello.
    第2步对应一系列SSL握手消息,服务器发送的第一条消息为ServerHello,其中包含了它所选择的算法,接着再在Certificate消息中发送其证书。最后,服务器发送ServerHelloDone消息以表示这一握手阶段的完成。需要ServerHelloDone的原因是一些更为复杂的握手变种还要在Certifacate之后发送其他一些消息。当客户端接收到ServerHelloDone消息时,它就知道不会再有其他类似的消息过来了,于是就可以继续它这一方的握手。
    第3步对应ClientKeyExchange消息。
    第5与第6步对应Finished消息。该消息是第一条使用刚刚磋商过的算法加以保护的消息。为了防止握手过程遭到篡改,该消息的内容是前一阶段所有握手消息的MAC值。然而,由于Finished消息是以磋商好的算法加以保护的,所以也要与新磋商的MAC密钥—起计算消息本身的MAc值。
    注意,上图中省略了两条ChangeCipherSpec消息。

三、SSL记录协议:
    在SSL中,实际的数据传输是使用SSL记录协议来实现的。SSL记录协议是通过将数据流分割成一系列的片段并加以传输来工作的,其中对每个片段单独进行保护和传输。在接收方,对每条记录单独进行解密和验证。这种方案使得数据一经准备好就可以从连接的一端传送到另一端,并在接收到的即刻加以处理。
    在传输片段之前,必须防止其遭到攻击。可以通过计算数据的MAC来提供完整性保护。MAC与片段一起进行传输,并由接收实现加以验证。将MAC附加到片段的尾部,并对数据与MAC整合在一起的内容进行加密,以形成经过加密的负载(Payload)。最后给负载装上头信息。头信息与经过加密的负载的连结称作记录(record),记录就是实际传输的内容。下图描述了传输过程:

3.1 记录头消息:
    记录头信息的工作就是为接收实现(receiving implementation)提供对记录进行解释所必需的信息。在实际应用中,它是指三种信息:内容类型、长度和SSL版本。长度字段可以让接收方知道他要从线路上这取多少字节才能对消息进行处理,版本号只是一项确保每一方使用所磋商的版本的冗余性检查。内容类型字段表示消息类型。

3.2 SSL记录类型:
    SSL支持四种内容类型:application_data、alert、handshake和change_cipher_spec。
使用SSL的软件发送和接收的所有数据都是以application_data类型来发送的,其他三种内容类型用于对通信进行管理,如完成握手和报告错误等。
    内容类型alert主要用于报告各种类型的错误。大多数alert(警示)用于报告握手中出现的问题,但也有一些指示在对记录试图进行解密或认证时发生的错误,alert消息的其他用途是指示连接将要关闭。
    内容类型handshake用于承载握手消息。即便是最初形成连接的握手消息也是通过记录层以handshake类型的记录来承载的。由于加密密钥还未确立,这些初始的消息并未经过加密或认证,但是其他处理过程是一样的。有可能在现有的连接上初始化一次新的握手,在这种情况下,新的握手记录就像其他的数据一样,要经过加密和认证。
    change_cipher_spec消息表示记录加密及认证的改变。一旦握手商定了一组新的密钥,就发送change_cipher_spec来指示此刻将启用新的密钥。

四、各种消息协同工作:
    正如我们所看到的,SSL是一种分层协议,它以一个记录层以及记录层上承裁的个同消息类型组成。而该记录层又会由某种可靠的传输协议如TCP来承载。下图描述了该协以的结构:

五、一次SSL连接的完整过程:

摘录自《SSL与TLS》

作者:Silent Void 
出处:http://happyhippy.cnblogs.com/

时间: 2024-09-22 21:12:35

SSL握手过程的相关文章

终极解决:iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites

iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 终极解决: ------------------ iOS 与

TCP连接建立的三次握手过程可以携带数据吗?

前几天实验室的群里扔出了这样一个问题:TCP连接建立的三次握手过程可以携带数据吗?突然发现自己还真不清楚这个问题,平日里用tcpdump或者Wireshark抓包时,从来没留意过第三次握手的ACK包有没有数据.于是赶紧用nc配合tcpdump抓了几次包想检验一下.但是经过了多次实验,确实都发现第三次握手的包没有其它数据(后文解释).后来的探究中发现这个过程有问题,遂整理探究过程和结论汇成本文,以供后来者参考. 先来张三次握手的图(下面这张图来自网络,若侵犯了作者权利,请联系我删除): RFC79

深入浅出TCP协议的三次握手过程

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放."三次握手"就发生在连接建立阶段. 1.三次握手(three times handshake) 所谓的"三次握手"即对每次发送的数据量跟踪进行协商使数据段的发送和接收同步,以及根据所接收到的数据量来确定数据发送.接收完毕后何时撤消联系,并建立虚连接. 第一次握手:主机A发送位码为syn=1,随机产生seq number

Apache2+php4.3.6+MySQL4.0.20+SSL配置过程

Apache2+php4.3.6+MySQL4.0.20+SSL详细配置过程: 首先安装将需要的文件都放到root目录下: 1.MySQL-client-4.0.20-0.i386.rpm 2. MySQL-server-4.0.20-0.i386.rpm 3. httpd-2.0.49.tar.gz 4. php-4.3.6.tar.gz 我们先来安装MySQL,步骤如下: # >rpm –Uvh MySQL-server-4.0.20-0.i386.rpm # >rpm -Uvh MySQ

【SSL】SSL工作原理

SSL技术白皮书 关键词:SSL,PKI,MAC 摘    要:SSL利用数据加密.身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证.本文介绍了SSL的产生背景.安全机制.工作过程及典型组网应用. 缩略语: 缩略语 英文全名 中文解释 AES Advanced Encryption Standard 高级加密标准 CA Certificate Authority 证书机构 DES Data Encryption Standard 数据加密标准 HTTPS Hyper

用OpenSSL编写SSL,TLS程序

用OpenSSL编写SSL,TLS程序(1) 作者:tamsyn  来源:www.sqlite.com.cn  时间:2006-6-28  [ 字体:大 中 小 ] [ 双击滚屏 ] 一:简介: SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版.TLS(Transport Layer Security)是IETF的TLS 工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,即RFC2246.SSL/TL

淘宝全站HTTPS 百万页面改造技术细节大起底

电商启用全站HTTPS是一件门槛极高的事情,它需要投入巨大的资源,不仅是人力.财力等方面,而且对技术能力也提出了极为苛刻的要求. 一般来说,普通电商只会在登录和交易这些"关键"环节启用HTTPS.而目前,阿里巴巴是全球唯一大规模启用电商平台全站HTTPS的公司. 什么是HTTPS?百科是这样解释的.HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道.即HTTP下加入SSL层,HTT

CDN HTTPS解决方案及优化实践

2017在线技术峰会,阿里云CDN技术专家容恪来为大家解析CDN HTTPS 红包背后的技术实践.本文主要从SSL/TLS 及 HTTP/2开始谈起,着重分析了HTTPS 架构和优化实践,最后对用户如何更好使用 HTTPS作了指导.   以下是精彩内容整理: SSL/TLS及HTTP/2介绍 HTTPS 对于HTTPS,其实是在HTTP 之下增加了 SSL/TLS的传输.在整个TCP/IP协议中的结构如图,传输层之上是会话层,会话层中传输的是SSL/TLS协议,HTTP 是在应用层.如果不用 S

[原创]有关tengine几个超时时间说明

原创文章,转载请注明:来自有关tengine几个超时时间说明 负载均衡的客户和技术支持同学经常问: 7层 HTTP Keepalive 超时时间 是15秒 和http 60S 这个超时时间有什么区别? 下边列出来具体的含义 1. keepalive_timeout 15s; 长连接中连续两个http/https请求之间空闲的最大时间,超过此时间后没有收到新请求会关闭TCP长连接 The first parameter sets a timeout during which a keep-aliv