| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络协议--SSL/TLS -> 正文阅读 |
|
[网络协议]网络协议--SSL/TLS |
一、简介????????SSL(Secure Socket Layer 安全套接层)最初是由网景公司(Netscape)研发,在SSL更新到3.0时,被IETF(互联网工程任务组)标准化后写入RFC, IETF对SSL3.0进行了标准化为TLS1.0,并添加了少数机制,两者差别极小,TLS可以理解为SSL3.1。 二、SSL和TLS的区别?2.1? SSL????????SSL(Secure Socket Layer,安全套接字层),位于TCP/IP协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。SSL由从前的网景公司开发,有1,2,3三个版本,但现在只使用版本3。
??SSL协议提供的服务主要有:? ? ? 1) 认证用户和服务器,确保数据发送到正确的客户机和服务器;、 ? ? 2) 加密数据以防止数据中途被窃取; ? ? 3) 维护数据的完整性,确保数据在传输过程中不被改变 2.2 TLS????????TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。TLS有1.0,1.1,1.2三个版本,默认使用1.0。 TLS 记录协议提供的连接安全性具有两个基本特性: ??
????????TLS的最大优势就在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。然而, TLS 标准并没有规定应用程序如何在TLS上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。 2.3 区别????????在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。???????? 1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。 2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。 3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。 4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。 5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。 6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。 7)加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。 ???????8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。 三、协议原理3.1 两个阶段TLS 协议可分为两个阶段: 3.2 TLS协议握手过程下面来介绍一下 Handshake 的具体过程。 3.3 协议格式3.3.1 TLS报文头????????TLS 报文头占 5 字节,第 1 字节是类型(目前有 4 种类型),第 2-3 字节是版本(目前有 4 种版本),第 4-5 字节是长度(不包含报文头本身长度),其格式为: 3.3.2 HandShake报文????????HandShake报文格式 如下: ? 注 1:共有 10 种类型的 Handshake 报文,每种类型的具体格式可参考:Traffic Analysis of an SSL/TLS Session 3.3.2.1 Client Hello报文 ? ? ? ?报文格式 ? ?????????client hello 握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数?Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。抓包示例如下: ?ClientHello中涉及到的消息具体如下:
3.3.2.2 Server Hello协议 ????????收到客户端问候之后服务器必须发送服务器问候信息,服务器会检查指定诸如TLS版本和算法的客户端问候的条件,如果服务器接受并支持所有条件,它将发送其证书以及其他详细信息,否则,服务器将发送握手失败消息。 ????????如果接受,第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数?Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。 ServerHello中涉及到的具体参数:
这个阶段之后,客户端服务端知道了下列内容:
3.3.2.3?Server Key Exchange (可选) ????????根据之前在ClientHello消息中包含的CipherSuite信息,决定了密钥交换方式(例如RSA或者DH),因此在Server Key Exchange消息中便会包含完成密钥交换所需的一系列参数。 因为这里是DH算法,所以需要发送服务器使用的DH参数。RSA算法不需要这一步。
3.3.2.4?Certificata Request (可选) -- 可以是单向身份认证,也可以是双向身份认证 ????????这一步是可选的,如果在对安全性要求高的常见可能用到。服务器用来验证客户端。服务器端发出Certificate Request消息,要求客户端发他自己的证书过来进行验证。该消息中包含服务器端支持的证书类型(RSA、DSA、ECDSA等)和服务器端所信任的所有证书发行机构的CA列表,客户端会用这些信息来筛选证书。 ????????如果服务器发送了?
3.3.2.5?Server Hello Done 该消息表示服务器已经将所有信息发送完毕,接下来等待客户端的消息。 3.3.2.6?Certificate(可选,双向认证) ????????如果在第二阶段服务器端要求发送客户端证书,客户端便会在该阶段将自己的证书发送过去。服务器端在之前发送的Certificate Request消息中包含了服务器端所支持的证书类型和CA列表,因此客户端会在自己的证书中选择满足这两个条件的第一个证书发送过去。若客户端没有证书,则发送一个no_certificate警告。 3.3.2.7?Client Key exchange ????????根据之前从服务器端收到的随机数,按照不同的密钥交换算法,算出一个pre-master,发送给服务器,服务器端收到pre-master算出main master。而客户端当然也能自己通过pre-master算出main master。如此以来双方就算出了对称密钥。 ????????如果是RSA算法,会生成一个48字节的随机数,然后用server的公钥加密后再放入报文中。如果是DH算法,这是发送的就是客户端的DH参数,之后服务器和客户端根据DH算法,各自计算出相同的pre-master secret.???????? 3.3.2.8 Certificata verify(可选,双向认证) ????????只有在客户端发送了自己证书到服务器端,这个消息才需要发送。其中包含一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_secret)进行签名。 ?完成握手协议,建立SSL连接。 3.3.2.9?ChangeCipherSpec ????????编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(ChangeCipherSpec是一个独立的协议,体现在数据包中就是一个字节的数据,用于告知服务端,客户端已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备使用之前协商好的加密套件加密数据并传输了)。 3.3.2.10 Client Finished ????????客户端握手结束通知, 表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验(使用HMAC算法计算收到和发送的所有握手消息的摘要,然后通过RFC5246中定义的一个伪函数PRF计算出结果,加密后发送。此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。) 3.3.2.10 Server Finished???????? ????????服务端握手结束通知。
????????根据之前的握手信息,如果客户端和服务端都能对Finish信息进行正常加解密且消息正确的被验证,则说明握手通道已经建立成功,接下来,双方可以使用上面产生的Session Secret对数据进行加密传输了。 3.3.3 SSL记录协议????????SSL记录协议为SSL连接提供两种服务:机密性和报文完整性。 ????????在SSL协议中,所有的传输数据都被封装在记录中。记录是由记录头和记录数据(长度不为0)组成的。所有的SSL通信都使用SSL记录层,记录协议封装上层的握手协议、报警协议、修改密文协议。SSL记录协议包括记录头和记录数据格式的规定。 ????????SSL记录协议定义了要传输数据的格式,它位于一些可靠的传输协议之上(如TCP),用于各种更高层协议的封装。主要完成分组和组合、压缩和解压缩,以及消息认证和加密等。 SSL记录协议主要操作流程如图所示: 图中的五个操作简单介绍如下: 1)每个上层应用数据被分成214字节或更小的数据块。记录中包含类型、版本号、长度和数据字? ? ? ? 段。 2)压缩是可选的,并且是无损压缩,压缩后内容长度的增加不能超过1024字节。 3)在压缩数据上计算消息认证MAC。 4)对压缩数据及MAC进行加密。 5)增加SSL记录。 SSL记录协议字段的结构如图8所示。 1)????????内容类型(8位):封装的高层协议。 2)????????主要版本(8位):使用的SSL主要版本。对于SSL?v3已经定义的内容类型是握手协议、警? ? ? ? ? ? ? 告协议、改变密码格式协议和应用数据协议。 3)????????次要版本(8位):使用的SSL次要版本。对于SSL?v3.0,值为0。 4)????????压缩长度(16位):明文数据(如果选用压缩则是压缩数据)以字节为单位的长度。 3.3.4 SSL告警协议?????????SSL报警协议是用来为对等实体传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种: ? ? ? ?1. Fatal错误,如传递数据过程中发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录。 ? ? ? ?2. Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。 四、参考
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:31:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |