当前位置: 首页 > news >正文

Https连接过程详解

概述

HTTPS相比较于HTTP而言,就是多了一个S,这个S我们可以称之为安全,说得通俗一点就是加密通信的HTTP而已。说的简单一点,就是每次通信,通信双方都会使用加密之后的数据通信。

连接

HTTPS连接大致可以分为5个步骤,我也是经过学习和看不同的资料才稍微有些感触,如果有不对的地方,请轻喷。
大致可以分为7个部分:

  1. Client Hello
  2. Server Hello
  3. 服务器发送证书
  4. 客户端验证证书
  5. 客户端生成随机数,通过证书中的公钥进行非对称加密,发送到服务器
  6. 服务器使用私钥解密,获取到该随机数,将该随机数设置为密钥,使用对称加密加密需要发送的数据
  7. 客户端解密数据,SSL通信开始

虽然一个HTTPS通信看上去很简单,其实内部还是非常复杂的,用到了证书验证,一次非对称加密,n次对称加密,单单捋起来还是比较复杂的。

client hello

客户端此时向服务器发送的报文此时包括:

  1. 当前支持的TLS版本集合
  2. 当前支持的非对称加密算法集合
  3. 当前支持的对称加密算法集合
  4. 当前支持的Hash算法集合
  5. 其他信息

server hello

此时,服务器需要选择自己支持的算法,然后发送给客户端,告诉客户端哪些算法是自己支持的。然后给客户端来一份自己的想法:

  1. 当前支持的TLS版本
  2. 当前支持的非对称加密算法
  3. 当前支持的对称加密算法
  4. 当前支持的Hash算法
  5. 其他信息

服务器发送证书

server hello完成之后,服务器又一次向客户端发送了证书和密钥,这个证书主要是为保证服务器和客户端之间通信是可靠的,证书中有很多东西需要验证。而密钥就是为了提供了验证的可能。为了方便下面的了解,我们需要对证书的结构有一定的了解。
就X509v3证书为例,主要结构为:

组成部分含义
tbsCertificate(to be signed certificate)待签名证书
SignatureAlgorithm签名算法
Signaturevalue签名值

而我们的tbsCertificate其实又包含了以下10个方面的东西:

组成部分含义
Version Number版本号
Serial Number序列号
Signature Algorithm ID算法签名ID
Issuer Name发行者
Validity period有效时间
Subject name证书主体名称
Subject Public key Info证书主体公钥信息 (公钥算法和公钥值)
Issuer Unique Identifier发行商唯一ID
Subject Unique Identifier主体唯一ID
Extensions其它扩展

客户端验证证书

这个证书验证还是蛮复杂的,因为涉及到很多概念,比如根证书、二级证书(CA)、 证书链等过程,我也曾经尝试去了解了一下,无奈比较复杂,只是了解了个大概。今天就聊一下这个大概。
客户端拿到这个证书之后,将会从tbsCertificate中获取证书的颁发机构,从而在浏览器内置的根证书中寻找该证书颁发机构是否为信任机构,如果不是,浏览器将会警告用户证书存在问题,一般会出现如下问题:
在这里插入图片描述
如果获取的证书颁发机构是合法的,则会从浏览器中找到对应信任机构的公钥,用这个公钥来解密当前证书的签名得到一个Hash值Hash1。上面证书结构中所说的,存在一个签名算法和签名值,这个值是服务器获取的证书(也就是信任机构所颁发的)使用私钥加密而成的,所以使用对应证书的公钥是可以解密的(如果没有错误),具体原因可以查看。然后我们对证书的内容进行一次Hash值,得到Hash2,如果当前的Hash1与Hash2值相等,那么说明证书是合法的,没有被修改过,用户可信任。
在接下来需要对证书的持有者对应的信息进行检查,比如URL是否为需要请求的URL;判断各种请求参数等等…稍微有点不符合,我们就判断当前数据存在问题,直接告警。

客户端产生随机数

如果上面的证书验证通过,此时客户端将会生成一个随机数,通过已经确定的非对称加密算法,使用公钥将这个随机数加密,然后发送到服务器。

服务端解密

服务器接收到数据,将会使用私钥解密发送过来的随机数,将会使用这个随机数设置为密钥,使用已经选择的对称加密算法,加密数据,然后将数据发送出去,从此服务端SSL通信正式开始。

客户端解密

接受到服务器的数据,使用对称算法,上面生成的随机数作为密钥,开始解密。从此,一次完整的HTTPS通信过程完成。

最后一张图:

在这里插入图片描述
最后,还是对证书的合法性验证存在比较模糊的认识,希望有更好的文章出现。
参考资料:
1.https://blog.csdn.net/liuxingrong666/article/details/83869161
2.https://blog.csdn.net/anjon520/article/details/24884207
3.https://www.cnblogs.com/felixzh/p/8316710.html
4.https://blog.csdn.net/u012852986/article/details/78873387

http://www.xdnf.cn/news/846127.html

相关文章:

  • Linux - 安装 Jenkins(详细教程)
  • Python编程入门——透析八大核心知识点快速掌握Python编程
  • VirtualBox虚拟机与主机互传文件的五种方法
  • Docker 搭建 Minio 容器 (完整详细版)
  • ASCII码对照表
  • vue 使用canvas 详细教程
  • ctf 002 MD5解密
  • FileZilla 的安装与使用
  • Spring(Spring/Springboot 的创建) 基础
  • 【保姆级教程】项目创建 - 初识 Qt 从零基础入门开始
  • 全国计算机一级B跟一级不同
  • 定制elementPlus主题
  • Elasticsearch环境搭建
  • Gitlab 安装部署
  • Springboot是什么?Springboot详解!入门介绍
  • 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)
  • Node快速入门
  • 管理系统中layui的一些常规操作,增加、修改、删除、查询
  • 超全能,MobaXterm远程工具,网工、运维这样用就对了
  • 1、nacos功能简介
  • 一文了解 2024 美国流媒体行业动态
  • SQL是什么?它能做什么?SQL的基本书写规则
  • 用例图、类图、包图
  • VLOOKUP函数16种经典用法(史上最全,记得收藏)
  • VUE基础知识九 ElementUI项目
  • 最全的git命令(详细)和对常见git操作流程讲解
  • MySQL安装和配置(超详细)
  • 【Element入门】2、Element UI 的基本使用
  • 2010年最骚最有深度的100句话!
  • vue基础教程(5)——十分钟吃透vue路由router