首页 程序笔记 SSL 连接过程详解

SSL 连接过程详解

1、SSL 简介

SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层与应用层之间对网络连接进行加密。

在标准的 HTTP 协议下,客户端与服务端直接通过 TCP 链接,以 明文 的形式交换数据,这样做其实在传输一些普通网页数据时并没什么问题,但是如果用户在浏览网页中,需要向服务端发送用户名、密码、银行卡号之类的敏感信息的话,我们不希望这些信息被入侵者所获取,也不希望其遭到篡改或伪造,这时就需要用到 SSL 了。

一个安全的通信往往需要包含三个特性:机密性、数据完整性、端点鉴别,三者缺一不可。

机密性:如果没有机密性,入侵者就可能截获客服端的报文,并获取其的敏感信息。

数据完整性:如果没有数据完整性,入侵者就可以随意篡截获的客户端报文,并对其的信息进行随意的篡改。

端点鉴别:如果没有端点鉴别,客服端所请求的服务器有可能是一个钓鱼网站,用来恶意收集用户的敏感信息。

SSL 就是通过提供机密性、数据完整性以及服务端和客户端鉴别,来强化一个普通的 TCP 链接。

因为 SSL 协议是运行在 TCP 之上的,因此,理论上来讲它能为包括 HTTP 协议在内的任何基于 TCP 连接的应用层协议提供安全性保障。下面来看一下 SSL 的工作原理。

2、SSL 工作原理

SSL 的工作主要可以分为三个阶段:握手、密钥导出、数据传输。

2.1、握手阶段:

在握手阶段需要完成的三个任务分别是:建立一条 TCP 连接、验证服务端身份、分发通信主密钥。大致过程描述如下:

客户端首先发起一条到服务端的 TCP 连接,随后的数据传输都是在这条 TCP 连接之上的,在 TCP 链接建立之后,客户端会向服务端发送 HELLO 报文,这个报文中包含了客户端所支持的密码算法列表,服务端在接收后会选用一种对称算法,一种非对称算法和一种 MAC 算法,连同其 证书 回应给客户端(这个证书就是经过权威机构认证的一个实体与其公钥的绑定)。

因为在各种的加密过程中,只要是涉及到使用公开密钥的,一般都会有公钥被入侵者盗用和伪造的风险,这时就需要权威机构颁发的数字证书来证明一个公要与实体的绑定。

客户端在收到服务端发来的证书之后,就可以明确的知道当前正在跟自己通信的服务端就是目标服务器,客户端随后会从证书中提取服务端发来的公钥,并在客户端生成一个随机的主密钥 MS,然后用服务端的公钥对其进行加密后发送给服务端,服务端会用自己的私钥解密得到主密钥 MS,这样就完成了主密钥的分发。

客户端和服务器都掌握了主密钥,有了这个其他人都不知道的主密钥,随后的数据加密和验证过程就好办了。

2.2、密钥导出:

密钥导出阶段,就是通信双方会以相同的方法,用主密钥生成四个密钥,这四个密钥的分别作用如下:

EB:用于从服务端到客户端发送数据的会话加密密钥

MB:用于从服务端到客户端发送数据的会话 MAC 密钥

EA:用于从客户端到服务端发送数据的会话加密密钥

MA:用于从客户端到服务端发送数据的会话 MAC 密钥

会话加密密钥就是实际用来加密传输数据的对称密钥,MAC 密钥在是标志传输数据完整性的密钥。

MAC:报文鉴别码,是一种用来监测报文完整性的技术。它的过程并不复杂,发送方将明文与一个鉴别密钥进行级联,这个鉴别密钥是通信双方所共有的,随后会计算这个级联后的数据散列值,这个散列值就叫做原始数据的报文鉴别码 MAC,将报文的鉴别码附加在原始明文后面,一同发送给接收方。接收方用收到的明文,级联相同的鉴别密钥,再以相同的方法计算散列值,与收到的散列值 MAC 进行对比,若两者相同,则说明数据未被篡改,上述的 MA 和 MB 就是 MAC 里的鉴别密钥。

2.3、数据传输:

SSL 将数据流分割成记录,对每个记录 EA 加密,并附加一个 MAC(用于完整性鉴别),然后对该记录与 MAC 进行加密,然后将这个被加密的包发送服务器,服务端收到这个数据包后,用相应的 EB 对称密钥进行解密,再用 MB 进行数据完整性检验。

3、报文重放攻击

上述操作看似是实现了对安全通信的三个基本需求,但是其对整个会话过程中报文流的数据完整性的保障并未达到天衣无缝,虽然单个记录的报文完整性可以由 MAC 保障,但是若是入侵者恶意调换两个 SSL 记录的顺序,或者故意多次重放同一个 SSL 记录多次,这样会导致接收方收到的最终报文不正确,这也就是 "报文重放攻击"。

不过这个问题可以通过序号来解决,你可能会想,在每一个记录中增加一个序号不就行了么,但是实际上不必直接在 SSL 记录中额外包含一个序号,只需要由发送方自己维护一个计数器,每发送一次,就将自己的计数器 +1,并在计算记录 MAC 时,将这个需要括在 MAC 中的记录中,接收方也跟踪自己收到的所有记录的序号,同样在计算记录 MAC 进行校验时,让自己跟踪到的序号参与计算,若计算结果相同就说明记录即通过了完整性检验,也没有被篡改顺序。

站心网

1、SSL 简介SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Securit..

为您推荐

交易系统:退款单模型设计详解

大家好,我是汤师爷~和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。售后域核心概念模型1、退款单退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织退款单ID..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

详解:订单履约系统规划

大家好,我是汤师爷~什么是订单履约系统?订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。..

Redis 数据结构详解

Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

javascript 6种连接数组的方法和对比

在 JavaScript 中,有多种方法可以用来连接数组,以下是常见的几种:1. concat() 方法用于连接两个或多个数组,返回一个新的数组,不修改原数组。const arr1 = [1, 2, 3];const arr2 = [4, 5, 6];const result = arr..

.Net Core中Dapper的使用详解

1.安装Dapper这里直接使用Nuget安装。安装版本是1.50.5安装完成之后,发现Nuget下已经有了Dapper。2.创建DapperHelper接下来创建一个DapperHelper帮助类,来进行读取数据库连接字符串,打开数据库等操作。public cla..

SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 这个错误通常表示客户端在尝试连接到服务器时,服务器没有及时响应,导致连接超时。以下是一些可能的原因和解决方法:可..

.NET C# EntityFramework(EF)连接SQLite代码示例

在.NET C#中使用Entity Framework(EF)连接SQLite数据库是一种常见的做法,可以有效地管理和操作数据。以下是一个简单的示例代码,展示了如何使用EF Core连接到SQLite数据库并执行基本的CRUD操作。首先,确保你已经..

使用ADO.NET连接到南大通用GBase 8s数据库

南大通用GBase 8s数据库广泛应用于各种企业级应用中,对于开发者而言,掌握如何使用ADO.NET连接到GBase 8s数据库非常重要。本文将详细阐述如何通过ADO.NET方式连接到南大通用GBase 8s数据库,并进行基本的数据库操作..

Entity Framework Core 连接PostgreSQL

Entity Framework Core PostgreSQL 库是一个由 Npgsql 开发和维护的 NuGet 包,用于使用 Entity Framework Core 访问 PostgreSQL 数据库。要使用 Entity Framework Core PostgreSQL 库,需要先安装 NuGet 包。Instal..

DevEco Studio鸿蒙OS系统开发环境搭建详解

DevEco Studio 是华为推出的一款面向华为终端全场景多设备的集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用开发服务。DevEco Studio官网:https://developer.harmonyo..

c#中责任链模式详解

基本介绍:  “责任链”顾名思义,是指一个需要负责处理请求的链条。  每个链条节点都是一个单独的责任者,由责任者自己决定是否处理请求或交给下一个节点。  在设计模式中的解释则为:为请求创建了一个接收者..

.NET Core连接和操作MongoDB用法示例

连接和操作MongoDB与.NET Core可以通过MongoDB官方提供的.NET驱动程序来实现。以下是一种基本的连接和操作MongoDB的方法:步骤 1: 安装 MongoDB 驱动程序首先,在你的.NET Core项目中安装 MongoDB.Driver 包。你可以..

定时调度框架系列之Quartz.Net详解

一. 背景我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用"、"每隔..

你如何设计一个可扩展的.NET应用程序架构?请描述你在这方面的思考过程和实践经验。

设计可扩展的.NET应用程序架构是为了满足应用程序在需求增长和负载增加时的可扩展性和性能要求。下面是我在这方面的思考过程和实践经验:需求分析:首先,我会进行需求分析,了解应用程序的功能需求和预期的负载。这..

Linux中通过命令连接指定WiFi

前言在Linux中,尤其是在没有GUI界面的Linux系统中,需要连接WiFi时只能通过命令来完成,大致过程如下:安装软件连接WiFi需要用到iw,wpa_supplicant和net-tools中的一些工具,一些嵌入型Linux中可能已经在生成系统..

发表回复

返回顶部