关于HTTPS的TSL握手

yizhihongxing

HTTPS是HTTP协议在TLS/SSL加密协议下的安全传输方式。TLS是TLS/SSL加密协议的新版本,TLS协议握手过程如下:

TLS握手过程

  1. 客户端发送一个Client Hello消息给服务器端,这个消息包含TLS支持的协议版本、加密算法列表和随机数等信息。

markdown
# 客户端Hello包

  1. 服务器端收到Client Hello后,发送一个Server Hello消息给客户端,这个消息包含服务端选择的TLS协议版本、加密算法、证书以及一个随机数等信息。

markdown
# 服务器端Hello包

  1. 接下来,服务器端发送一个Certificate消息,这个消息包含证书链,包括服务器证书和中间CA证书等。

markdown
# 服务器端Certificate包

  1. 客户端对服务器端的证书进行验证,如果验证失败,可能会提示证书不合法或者提醒用户风险较高。如果验证成功,客户端生成一个预主密钥,然后用服务器端发来的公钥来加密预主密钥。客户端发送一个Client Key Exchange消息给服务器。

markdown
# 客户端Key Exchange包

  1. 服务器端使用私钥解密客户端发来的预主密钥,并且生成本次会话的主密钥。服务器发一个Server Key Exchange消息给客户端,这个消息包含服务器的数字签名,使用主密钥来保证消息的完整性。

markdown
# 服务器端Key Exchange包

  1. 之后,服务器端发送一个Server Hello Done消息告诉客户端握手阶段结束。

markdown
# 服务器端Hello Done包

  1. 客户端也生成会话的主密钥。然后,客户端发送一个Change Cipher Spec消息,告诉服务器端:接下来的消息都会使用新的主密钥和加密算法。最后,客户端发送一个Finished消息给服务器端。

markdown
# 客户端Finished包

  1. 服务器端也发送一个Change Cipher Spec消息,告诉客户端:接下来的消息都会使用新的主密钥和加密算法。服务器端也发送一个Finished消息给客户端。

markdown
# 服务器端Finished包

  1. 握手完成。编号7、8两步被称作ChangeCipherSpec协议阶段,在这两个阶段前后使用的主密钥和加密算法已经不同了。之后服务器和客户端以加密方式通信。

示例说明

以下示例中 => 为发送消息的方向,==>表示服务器返回的消息,示例中参考了一篇博客

  • 一般的HTTPS请求流程:

```
当你在浏览器里输入https://www.baidu.com,浏览器向服务器发起链接请求,服务器返回一个证书,浏览器验证证书的合法性,如证书失效或者证书不合法等,浏览器有可能提示用户有网站冒充的风险, 此时可以选择是否继续;

你选择继续,浏览器通过证书里的加密算法和密钥来加密询问信息并传输给服务器。服务器收到询问信息后用自己的私钥解密后,并尝试对发送出去的消息做一次数字签名,并把消息和签名向浏览器发回。

浏览器会等待,直到服务器向其发送完成连接消息;浏览器再次发送一条加密请求到服务器,服务器用同样的算法和密钥进行加密运算后,发送给浏览器,浏览器再根据确认的方法对其确认,确认后,浏览器发送一条成功的链接消息给服务器,此时,HTTPS的安全链接建立成功。

浏览器和服务器就可以在这条安全的连接上进行数据交换了,所有信息的传输都是加密的,在传输过程中不会被别人窃取到或者改变。
```

  • 具体一次TLS握手过程:

  • 客户端发送请求

    ```markdown

    ClientHello

    s---[client hello]->e

                                               ,---- ServerHello
                                               |   Certificate
                                               |   ServerKeyExchange
                                               |   CertificateRequest
                                               | <Private Key operation>
                                               `-- ServerHelloDone
    

    Client Certificate

    s<--[certificate+keyattestation]<-e

    Client Key Exchange

    s---[key exchange]->e

                                               ,-------- Certificate
                                               |      ClientKeyExchange
                                               | <Private Key operation>
                                               `---[change cipher spec]--->
    

    Change Cipher Spec

    s---[change cipher spec]->e

                                               ,--   Finished
                                               |     (Hash for integrity)
                                               | <Private Key operation>
                                               `---[Finished]--->
    

    Finished

    s<--[Finished(verify)]<-e
    ```

  • 服务器发送响应

    ```markdown

    ClientHello

    ServerHello

    s<--[server hello]<-e

    Certificate

    s<--[certificate]<-e

    Server Key Exchange

    s<--[key exchange]<-e

    Certificate Request

    s<--[certificate request]<-e

    ServerHelloDone

    s<--[hello done]<-e

    Client Certificate

    s---[certificate+keyattestation]->e

    Client Key Exchange

    Change Cipher Spec

    s<--[change cipher spec]<-e

    Finished

    s---[Finished(verify)]->e

    Finished

    s<--[Finished(verify)]<-e
    ```

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于HTTPS的TSL握手 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境

    下面我将详细讲解“Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境”的完整攻略。 1. 前置条件 在开始搭建秒杀环境之前,需要先安装Docker和Docker Compose,并确保已经熟悉Docker和Docker Compose的基本使用。 2. 搭建过程 2.1 新建项目目录 首先,新建一个项目目录,比如s…

    node js 2023年6月8日
    00
  • 详解HTTPS 的原理和 NodeJS 的实现

    详解 HTTPS 的原理和 NodeJS 的实现 HTTPS 的原理 HTTPS (Hypertext Transfer Protocol Secure),是一种使用安全套接字层(SSL)或传输层安全(TLS)的加密协议,用于在互联网上安全地传输数据,确保网站的安全性。HTTPS 的原理可以简单分为以下几个步骤: 客户端向服务器发送 HTTPS 请求。与 H…

    node js 2023年6月8日
    00
  • javascript object oriented 面向对象编程初步

    JavaScript 面向对象编程初步 前言 JavaScript 是一种面向对象的编程语言,面向对象编程(Object Oriented Programming)是一种编程范式,它将数据抽象为对象,对象之间相互关联,通过这种方式组织代码和数据,使得代码更加易读易懂、可维护性更高。 在 JavaScript 中,我们可以使用函数、对象和原型等方式来实现面向对…

    node js 2023年6月8日
    00
  • nodejs中的异步编程知识点详解

    Node.js中的异步编程知识点详解 什么是异步编程 在 Node.js 中,异步编程是非常常见的,它可以让程序更高效地利用资源,提高了程序的性能。 异步编程是指程序不需要等待某个操作完成,就能继续进行下一步操作。它通常会发送一些请求,然后继续执行其他任务,直到得到请求的响应后再执行相应的回调函数。 异步编程的优势 更高效的利用资源 在执行某个任务的同时,我…

    node js 2023年6月8日
    00
  • js indexOf()定义和用法

    js indexOf()定义和用法 indexOf() 是JS中一个用于查找字符串中指定值的方法,它返回指定值在字符串中的位置,否则返回-1。它不改变原字符串。 语法 indexOf() 的语法格式如下: string.indexOf(searchvalue, startposition); 参数说明 string (必选):表示需要被检索的字符串。 sea…

    node js 2023年6月8日
    00
  • npm包发布和删除的超详细教程

    当你编写了一些 Node.js 模块或应用程序,并且想要与其他人共享时,你需要将它们发布到 npm 上。本文将详细介绍如何发布和删除 npm 包的步骤。 发布 npm 包的步骤 1. 创建一个新的 npm 包 首先,你需要创建一个新的 npm 包。你可以使用 npm init 命令简单地创建一个默认的 package.json 文件,或者修改现有的 pack…

    node js 2023年6月8日
    00
  • 学习 NodeJS 第八天:Socket 通讯实例

    让我为你介绍一下“学习 NodeJS 第八天:Socket 通讯实例”的完整攻略。 简介 本文将介绍 Socket 通讯实例以及如何使用 Socket 建立通信。 Socket 通讯实例 建立 Socket 服务器 要建立一个 Socket 服务器,你需要使用 net 模块。下面是一些示例代码: const net = require(‘net’); con…

    node js 2023年6月8日
    00
  • socket.io断线重连的几种场景及处理方法

    Socket.IO断线重连的几种场景及处理方法 在使用Socket.IO时,由于网络或服务器等原因,可能会出现断线的情况。本文将详细讲解Socket.IO断线重连的几种场景及处理方法。 场景一:客户端主动断开连接 当客户端主动断开连接时,Socket.IO会触发disconnect事件。如果需要重连,可以在disconnect事件中调用socket.conn…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部