浅析安全传输协议HTTPS之“S”

当前互联网,在各大浏览器厂商和CA厂商的推动下,掀起了一股HTTPS应用浪潮。为了让大家更好的了解HTTPS,本文给大家介绍关于HTTPS 中的S一个整体的认识。从其产生的历史背景、设计目标说起,到分析其协议设计结构、交互流程是如何实现其目标。

历史

S代表Secure,所以HTTPS自然就是更安全的HTTP的意思。互联网诞生之初SSL(Secure Sockets Layer 安全套接层)是由Netscape 这家最早的浏览器公司设计的,主要是用于Web安全传输的协议,这种协议在早期Web上获得了广泛的应用。后来被IETF标准化形成了 TLS(Transport Layer Security 传输层安全)标准,其历史如下:

1994: SSL1.0,因为存在严重的安全漏洞,未发布。

1995: SSL2.0,这个版本由于设计缺陷,很快被发现有严重漏洞,被废弃。

1996: SSL3.0,重新设计并开始流行,SSL前三个版本都是由Netscape设计实现。

1999: TLS1.0,IETF将SSL标准化,即RFC 2246。

2006: TLS1.1,作为RFC 4346 发布。

2008: TLS1.2,作为RFC 5246 发布 。

2015: TLS1.3,尚在制定中,处于草案阶段。

如上,现在互联网世界使用最广泛的应该是TLS1.2 标准。

目标

SSL/TLS最初的设计目标就是为了实现下面三个目的:

保密:第三方无法窃听。

完整:无法篡改。

认证:防止身份冒充。

互联网是一个开放的环境,十分复杂。网上两端通信的双方彼此都不知道谁是谁,双方如何信任、信息如何保密,如何不被篡改,这是十分复杂的问题。而且互联网本身就像有生命一般在不断进化,如何设计一个协议来应对未来可能的变化,因而这使得 SSL/TLS 协议的设计十分复杂。

结构

我们知道整个互联网构建于TCP/IP 协议栈基础之上,在描述协议设计细节之前,我们先看看SSL/TLS 协议处于该分层协议栈结构中的位置,其分层结构位置参考如下:

交互

SSL/TLS 协议设计之初就考虑了互联网和安全算法生命周期的演变,所以设计了一个算法协商握手流程,允许未来随着新安全算法的诞生可以灵活的加入到协议中,这就是典型的软件可扩展性设计的范例。下面是协议握手流程:

握手的目的简单概括就是:通信双方协商出一套会话密钥,然后基于此密钥通过对称加密方式来安全通信。

Client Hello

握手交互流程,首先由Client 端发起ClientHello 请求。在这个请求中Client 端向Server 端提供如下信息:

SSL version : 自己支持的最高协议版本,比如TLS1.2。

Ciphers : 支持的加密套件,比如:RSA 非对称加密算法,AES 对称加密算法。

Random number: Client 端随机数,将会用来生成会话密钥。

Server Hello

Server 收到ClientHello 请求后需要回应一系列内容,从ServerHello 到ServerHelloDone,有些服务端的实现是每条单独发送,有些服务端实现是合并到一起发送。

ServerHello

根据Client 端的请求信息确认使用的协议版本和加密套件(Cipher Suite),和客户端一致,并生成一个Server 端随机数,用来生成会话密钥。

Certificate

Server 端用于证明自身身份的凭证,一种由专门的数字证书认证机构(Certificate Authority 简称 CA)通过非常严格的审核之后颁发的电子证书,由Client 端去认证 Server 端的合法身份。

ServerKeyExchange

可选的,补充生成会话密钥的信息。对于前面协商的有些加密算法若Certificate 未提供足够的信息或就没有Certificate那么需要发送该消息。

CertificateRequest

可选的,Server 端需要认证Client 端身份的请求时发送。比如,银行提供的各类U盾,其实就是一种Client 证书,一般在线使用专业版网银时才需要。

ServerHelloDone

表示Server 响应结束。

Client Finished

Client收到Server 回应后,首先验证Server 的证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,Client 会继续回应 Server,包括如下内容:

Certificate

Client 端响应 Server 的 CertificateRequest 请求。

ClientKeyExchange

Client 再生成一个随机数,又称 premaster secret 用于生成会话密钥的信息,并把这个随机数传递给 Server 用于 Server 生成相同的会话密钥。

CertificateVerify

用于对客户端证书提供证明,对于特定的证书需要可选发送。

ChangeCipherSpec

用于告知 Server,Client 已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备使用之前协商好的加密套件和会话密钥加密数据并传输了。

Finished

Client 会使用之前协商好的加密套件和会话密钥加密一段 Finished 的数据传送给 Server,此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。

Server Finished

Server 在接收到客户端传过来的 premaster secret 数据之后,也会使用跟 Client 同样的方式生成会话密钥。一切就绪后,服务端回应如下内容:

NewSessionTicket

表示新建了一个会话票据,传递给 Client。若连接意外中断 Client 需要重建会话时,可以复用该票据,加速握手过程。

ChangeCipherSpec

告知 Client 已经切换到协商过的加密套件状态,准备使用加密套件和会话密钥加密数据并传输了。

Finished

Server 会使用之前协商好的加密套件和会话密钥加密一段 Finished 的数据传送给 Client,此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。

至此,整个握手阶段全部结束。接下来 Client 和 Server 进入使用会话密钥的加密通信过程。

认证

前面提及证书验证部分属于SSL/TLS 协议中比较复杂的部分,我们单独用一节分析下。证书是由CA 签发的,所以要验证证书的有效性需要去CA 的服务器,流程如下。

在线证书状态验证采用了 OCSP(Online Certificate Status Protocol 在线证书状态协议)协议去验证。但如果按上面这个方式,那HTTPS 就慢死了,不实用,所以有了OCSP stapling 方式,其流程如下:

Server 端会定期去CA同步一份经过CA 认证签名的证书状态检查结果并伴随 ClientHello 响应返回给 Client 端。因为这个结果是CA 自己通过数字签名,Server 也无法伪造或篡改,因此Client 可以信任这个结果,以达到减少不必要的步骤提升性能的效果。

另外,证书根据其认证类型可分为三类:

Domain Validation

DV证书用于验证一个或多个域名的所有权,无需递交纸质文件,仅验证域名管理权,无需人工验证申请单位真实身份。

Organization Validation

OV证书用于验证此域名由特定组织或单位所拥有的域名。申请此类证书,通过证书颁发机构审查网站企业身份和域名所有权以证明申请单位是一个合法存在的真实实体,CA 机构将在人工核实后签发证书。

Extended Validation

EV证书是目前最高信任级别的证书。通过极其严格甚至苛刻审查网站企业身份和域名所有权,确保网站身份的真实可靠。

我们经常通过浏览器访问一些安全级别比较高的网站时,都是基于HTTPS 协议,这时浏览器会显示一个绿色的「锁型」标记,让我们心理感到放心。

另外,SSL/TLS 协议中比较复杂的部分是关于加密套件的,这块基本属于密码学背后的数学原理部分。对于我们来说大概只需要搞清楚对称加密、非对称加密、HASH 算法的区别和时间开销。在选择密码套件时知道哪类是哪类,跟上主流的选择就行了。

案例

讲完SSL/TLS 的基本原理和交互流程,就以我所在的IM 项目为例,这里同时涉及 HTTP + S 和 TCP + S。HTTP 属于全公司一起加S,那就加在统一的负载均衡层,也就是HAProxy 那里,对整体应用无影响(参见下面部署结构图)。而IM 客户端应用也可以间接通过HTTPS 前置请求获得对服务端的认证,然后选择接入服务器建立TCP 长连接。TCP 长连接实际只需要做加密保护,不再需要二次认证。

一开始,我们是在自己的接入应用中,基于JDK 的SSL 库实现的TCP + S,但是发现在高并发压力下发现性能衰退的厉害,后来便改成了使用Nginx 前置接入的方式。对比性能测试如下所示:

可以看出引入SSL后确实带来了一些性能开销,不过整体不大。

至此,我们基本把HTTPS 涉及的SSL/TLS 相关的内容整体而粗浅的探讨了一番,至于更细节的一些内容,大家若有兴趣可以去看RFC和一些参考资料。

文章来源:聚力诚信/BestCert

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kernel32.dll文件丢失的几种相应解决办法,成功解决丢失难题

当启动计算机并尝试运行某个应用程序时,屏幕上突然弹出一条醒目的错误提示:“电脑显示kernel32.dll丢失”。这也就意味着操作系统在当前环境下无法找到名为“kernel32.dll”的动态链接库文件。这个问题可能会导致一些应用程序无法正常运行,给…

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口: Text(content?: string | Resource) 参数: 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效,显示Span内容,并且此时text组件的样式不…

模型优化和调整(2)

接模型优化和调整(1) 调整反向传播 梯度消失和梯度爆炸 梯度消失和梯度爆炸都和计算出来的“delta”有关。理想的delta应该是逐渐减小的。如果delta一直太小,则会导致下降太慢,甚至对于权重没有改变,此时形成了梯度…

远程桌面无法连接怎么办?

远程桌面无法连接是指在尝试使用远程桌面功能时出现连接失败的情况。这种问题可能会给工作和生活带来极大的不便,因此我们需要寻找解决办法。在讨论解决方案之前,我们先来了解一下【天联】组网的优势。 【天联】组网的优势有很多。它能够解决复杂网络环境…

我自己开发的App上架了

我自己开发的App上架了 1、梦想实现 前几天,我在华为应用市场上架了我自己开发的App,心情十分激动。自从毕业后进入职场,在Android岗位上干了5年,一直想要开发一款App,为什么会有这种想法?一是能够按照自…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型,使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重:2B和7B。每种尺寸都带有经过预训练&a…

大话设计模式——18.策略模式(Strategy Pattern)

简介 是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。 UML图 应用场景 Java AWT中的LayoutManager(布局管理器&…

蓝桥杯简单模板

目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 ​编辑 位数分离 正写 ​编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法,例如现在让算一个49,21…

Three.js--》实现2D转3D的元素周期表

今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 目录 项目搭建 平铺元素周期表 螺旋元素周期表 网格元素周期表 球状元素周期表 加底部交互按钮 项目…

OpenHarmony实战:瑞芯微RK3568移植案例

本文章是基于瑞芯微RK3568芯片的DAYU200开发板,进行标准系统相关功能的移植,主要包括产品配置添加,内核启动、升级,音频ADM化,Camera,TP,LCD,WIFI,BT,vibrato…

每日一题(力扣)---插入区间

官方网址:. - 力扣(LeetCode) 题目: 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals按照 st…

【鸿蒙开发】@State装饰器:组件内状态

1. 概述 State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型和本地初始化。 2. 装饰器使用规则说明 State变量装饰器 说明 装饰器参数 无 同步类型 不与父组件中任何…

蚁群(ACO)算法简介

蚁群(ACO)算法简介 前言一、 ACO简介1. 起源2. 思想3. 基本概念3.1 并行3.2 禁忌表3.3 启发式信息 4. 流程 前言 生活中我们总能看到一群蚂蚁按照一条非常有规律的路线搬运食物回到巢穴,而且每只蚂蚁的路线都是近似相同且较优的,…

7-11 分段计算居民水费

题目链接&#xff1a;7-11 分段计算居民水费 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>static float money (unsigned int water) {if (water < 15) { // 不超过15吨时if (water) { // 不为0return wat…

教师必备工具?了解一下国产电路仿真软件的教学应用吧!

在当今信息化时代&#xff0c;科技的不断发展为教学提供了更多可能性。特别是在电子工程领域&#xff0c;教师们需要寻找更有效的方式来教授复杂的电路知识。在这个背景下&#xff0c;国产电路仿真软件的教学应用成为了备受关注的话题。本文将探讨教师使用电路仿真软件的必要性…

【MySQL学习】MySQL的慢查询日志和错误日志

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

SpringCloudAlibaba基础使用(2024最全、最新)

一、简介二、服务注册配置Nacos2.1 下载启动2.2 服务注册2.3 服务配置2.3.1 NameSpace-GroupID-DataId 三、熔断限流 Sentinel3.1 介绍3.2 下载安装3.3 如何使用3.3.1 流控规则流控模式流控效果 3.3.2 熔断规则慢调用比例异常比例异常数 3.3.3 SentinelResource3.3.4 热点规则3…

铁山靠之数学建模-基础篇

小黑子的数模基础篇 一、什么是数学建模1.1 数学模型分类1.2 备战准备什么1.3 组队学习路线1.4 赛前准备1.5 赛题选择1.5.1 赛题类型1.5.2 ABC赛题建议 1.6 学会查询1.6.1 百度搜索技巧1.6.2 查文献1.6.3 数据预处理 1.7 建模全过程 二、数模论文2.1 论文排版2.2 标题怎么写2.3…

UE4 避免布料模拟重置后抖动

问题&#xff1a;每次设置带布料模拟的布料新位置&#xff0c;就会发生突然的抖动 解决办法&#xff1a;给“布料混合权重”或“布料最大距离缩放”K帧&#xff0c;参考数值为0.2—1&#xff08;红框内的值都试过无法解决&#xff09;

Swift 异步序列 AsyncStream 新“玩法”以及内存泄漏、死循环那些事儿(上)

概览 异步序列&#xff08;Async Sequence&#xff09;是 Swift 5.5 新并发模型中的一员“悍将”&#xff0c;系统标准库中很多类都做了重构以支持异步序列。我们还可以用 AsyncStream 辅助结构非常方便的创建自己的异步序列。 这里我们就来一起聊聊 AsyncStream 结构&#xf…