热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SSL原理及应用(1)SSL协议体系结构

SSL(SecureSocketsLayer,安全套接层),是为网络通信提供安全及数据完整性的一种安全协议。由Netscape研发,用以保障在Internet上数据传输的安全,利用数据加密

SSL(Secure Sockets Layer ,安全套接层),是为网络通信提供安全及数据完整性的一种安全协议。Netscape研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,确保数据在网络上的传输过程中不会被截取及窃听。

当前几乎所有浏览器都支持SSL,但是支持的版本有所不同。从图8-1中可以看到,IE同时支持SSL 2.0和SSL 3.0两个版本。

 

 

图8-1            IE支持的SSL版本

事实上各位读者已经明白了SSL的工作原理,回顾我前面博客讲到的公钥加密的通信原理,而SSL使用的就是公钥加密系统。现在完全可以构想基于SSL的数据通信流程。前面说过,SSL是一种协议,本节重点在于协议本身和它是如何工作在各种协议之间来提供安全通信的。

SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它使客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商,以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。

SSL协议体系结构如图8-2所示。

图8-2            SSL协议体系结构

从体系结构图可以看出,SSL协议可分为两层:

q  SSL记录协议(SSL Record Protocol):建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

q  SSL握手协议(SSL Handshake Protocol):建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议实际上是SSL握手协议、SSL修改密文协议SSL警告协议和SSL记录协议组成的一个协议族。下面分别进行介绍。

SSL记录协议

SSL记录协议为SSL连接提供两种服务:机密性和报文完整性。

SSL协议中,所有的传输数据都被封装在记录中。记录是由记录头和记录数据(长度不为0)组成的。所有的SSL通信都使用SSL记录层,记录协议封装上层的握手协议、报警协议、修改密文协议SSL记录协议包括记录头和记录数据格式的规定。

SSL记录协议定义了要传输数据的格式,它位于一些可靠的传输协议之上(如TCP),用于各种更高层协议的封装。主要完成分组和组合、压缩和解压缩,以及消息认证和加密等。

SSL记录协议主要操作流程如图8-3所示。

图8-3            SSL记录协议的操作流程

图中的五个操作简单介绍如下:

1)每个上层应用数据被分成214字节或更小的数据块。记录中包含类型、版本号、长度和数据字段。

2)压缩是可选的,并且是无损压缩,压缩后内容长度的增加不能超过1024字节。

3)在压缩数据上计算消息认证MAC。

4)对压缩数据及MAC进行加密。

5)增加SSL记录。

SSL记录协议字段的结构如图8-4所示。

图8-4            SSL记录协议字段的结构

如图8-4 SSL记录协议字段结构主要由内容类型、主要版本、次要版本、压缩长度组成,简介如下:

1)        内容类型(8位):封装的高层协议。

2)        主要版本(8位):使用的SSL主要版本。对于SSL v3已经定义的内容类型是握手协议、警告协议、改变密码格式协议和应用数据协议。

3)        次要版本(8位):使用的SSL次要版本。对于SSL v3.0,值为0。

4)        压缩长度(16位):明文数据(如果选用压缩则是压缩数据)以字节为单位的长度。

说明 已经定义的内容类型是握手协议、警告协议、修改密文协议

SSL报警协议

SSL报警协议是用来为对等实体传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种:

q   Fatal错误,如传递数据过程中发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录。

q  Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。

SSL修改密文协议

为了保障SSL传输过程的安全性,客户端和服务器双方应该每隔一段时间改变加密规范。所以有了SSL修改密文协议SSL修改密文协议是3个高层的特定协议之一,也是其中最简单的一个。在客服端和服务器完成握手协议之后,它需要向对方发送相关消息(该消息只包含一个值为1的单字节),通知对方随后的数据将用刚刚协商的密码规范算法和关联的密钥处理,并负责协调本方模块按照协商的算法和密钥工作。

SSL握手协议

SSL握手协议被封装在记录协议中,该协议允许服务器与客户机在应用程序传输和接收数据之前互相认证、协商加密算法和密钥。在初次建立SSL连接时,服务器与客户机交换一系列消息。

这些消息交换能够实现如下操作:

q  客户机认证服务器

q  允许客户机与服务器选择双方都支持的密码算法

q  可选择的服务器认证客户

q  使用公钥加密技术生成共享密钥

q  建立加密SSL连接

SSL握手协议报文头包括三个字段:

q  类型(1字节):该字段指明使用的SSL握手协议报文类型。

q  长度(3字节):以字节为单位的报文长度。

q  内容(≥1字节):使用的报文的有关参数。

SSL握手协议的报文类型如表8-1所示。

表8-1  SSL握手协议报文类型

报文类型

参数

hello_request

client_hello

版本、随机数、会话ID、密文族、压缩方法

server_hello

版本、随机数、会话ID、密文族、压缩方法

certificate

x.509V3证书链

server_key_exchange

参数、签名

certificate_request

类型、授权

server_done

certificate_verify

签名

client_key_exchange

参数、签名

finished

Hash值

SSL握手协议过程如图8-5所示。

图8-5            SSL握手协议的过程(带*的传输是可选的,或者与站点相关的,并不总是发送的报文)

现在看图8-5,分步说明SSL握手协议的全过程:

步骤1      建立安全能力。

客户机向服务器发送client_hello报文,服务器向客户机回应server_hello报文。建立的安全属性包括:协议版本、会话ID、密文族、压缩方法,同时生成并交换用于防止重放攻击的随机数。密文族参数包括密钥交换方法(Deffie-Hellman密钥交换算法、基于RSA的密钥交换和另一种实现在Fortezza chip上的密钥交换)、加密算法(DES、RC4、RC2、3DES等)、MAC算法(MD5或SHA-1)、加密类型(流或分组)等内容。

步骤2      认证服务器和密钥交换。

在hello报文之后,如果服务器需要被认证,服务器将发送其证书。如果需要,服务器还要发送server_key_exchange;然后,服务器可以向客户发送certificate_request请求证书。服务器总是发送server_hello_done报文,指示服务器的hello阶段结束。

步骤3      认证客户和密钥交换。

客户一旦收到服务器的server_hello_done报文,客户将检查服务器证书的合法性(如果服务器要求),如果服务器向客户请求了证书,客户必须发送客户证书,然后发送client_key_exchange报文,报文的内容依赖于client_hello与server_hello定义的密钥交换的类型。最后,客户可能发送client_verify 报文来校验客户发送的证书,这个报文只能在具有签名作用的客户证书之后发送。

步骤4      结束。

客户发送change_cipher_spec报文并将挂起的CipherSpec复制到当前的CipherSpec。这个报文使用的是修改密文协议。然后,客户在新的算法、对称密钥和MAC秘密之下立即发送finished报文。finished报文验证密钥交换和鉴别过程是成功的。服务器对这两个报文响应,发送自己的change_cipher_spec报文、finished报文。握手结束,客户与服务器可以发送应用层数据了。

当客户从服务器端传送的证书中获得相关信息时,需要检查以下内容来完成对服务器的认证:

q   时间是否在证书的合法期限内;

q   签发证书的机关是否客户端信任的;

q   签发证书的公钥是否符合签发者的数字签名;

q   证书中的服务器域名是否符合服务器自己真正的域名。

服务器被验证成功后,客户继续进行握手过程。

同样地,服务器从客户传送的证书中获得相关信息认证客户的身份,需要检查:

q   用户的公钥是否符合用户的数字签名;

q   时间是否在证书的合法期限内;

q   签发证书的机关是否服务器信任的;

q   用户的证书是否被列在服务器的LDAP里用户的信息中;

q   得到验证的用户是否仍然有权限访问请求的服务器资源。

 

---------------注:本文部分内容改编自《.NET 安全揭秘》


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
0度的浪漫神探
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有