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

网络协议之https?

写在前面

https协议还是挺复杂的,本人也是经过了很多次的学习,依然感觉一知半解,无法将所有的知识点串起来,本次学习呢,也是有很多的疑惑点,但是还是尽量的输出内容,来帮助自己和在看文章的你来共同进步吧!
为了更加系统,行文采用线性的方式来进行,遇到一些点的话再单独展开说明。接下来我们就以https协议本身作为切入点开始吧!

1:https协议的流程

在这里插入图片描述
我们静下心来一步步的来看啊。首先客户端给服务端说:您好,我这边的加密套路是这样的,给你个随机数,后面有用,随机数后续使用,这个在https协议里叫client hello,接着服务端回复您好,我这边的加密套路是这样的,也给你个随机数,随机数也是后续使用,这个在https协议里叫server hello,如下方式抓包看下:
在这里插入图片描述
抓包看如下:
在这里插入图片描述
client hello可以看到加密套件信息:
在这里插入图片描述
接着是服务端给客户端发送这是我的证书,你也审核一下吧,这个过程叫client certificate,客户端收到服务端的证书后,通过自己内置的CA证书的公钥来解密信息,如果是能够解密则说明服务端的证书是找了合法的CA机构生成的(合法CA机构的公钥都是公开的,会内置在操作系统中,所以千万不要安装来路不明的操作系统,要不然你银行卡里的13块钱的余额怎么没的都不知道)。其中加密生成签名和验证签名的过程如下图:
在这里插入图片描述
这样客户端在验证了服务端的证书后继续后续流程,客户端给服务端发送将随机数字使用公钥加密传输,协议里叫Client Key Exchange,注意这里的公钥是服务端在CA机构签过名的公钥,即和服务端自己维护的私钥是配对的(注意和CA的私钥公钥区分),服务端收到加密的随机数字后,就可以使用自己保密存储的私钥来解密,获取这个随机数字了。接着客户端和服务端会使用前面流程的随机数们计算出相同的密钥,作为后续数据交换对称加密使用的密钥。
获取密钥之后,为了确保各自的密钥好使,会进行一些testing看下,就是下面的交互过程:
在这里插入图片描述
最后就是正常加密通信过程了:
在这里插入图片描述
关于证书是如何生成的我们在第二部分来看下。

2:证书

在https协议中有一个很重要的角色就是证书,什么是证书呢?证书的作用就是来证明服务的身份,以及服务端公钥的合法性,如果是CA签发的证书的话(背书),就是合法的证书,是能够使用操作系统内置的CA公钥解密的,浏览器会认为是其实安全的,如下:
在这里插入图片描述
反之不安全的会提示:
在这里插入图片描述
我们来看下这个过程,比如你创建了一个网站现在要使用https的安全传输协议,首先要做的就是生成网站使用的私钥:

[root@host-10-150-27-148 x]# openssl
OpenSSL> genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
....................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
OpenSSL> 

这样网站的私钥就有了(千万要保密保存不要泄露),接着通过私钥生成网站的证书请求文件(里面有网站公钥信息【通过私钥生成】,域名,邮箱等信息【提示我们录入的】),后续需要发送给CA生成签名证书,生成请求文件过程如下:

OpenSSL> req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dnogdashuaige
Email Address []:3454@qq.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:111111
An optional company name []:dahuyou

接着我们就可以将server.csr交给CA机构生成签名证书了,但是真的生成是要钱的,所以我们这里来模拟。
我们知道CA生成签名也是通过自己的私钥来进行的,所以先来模拟生成私钥等信息:

OpenSSL> genrsa -des3 -out ca.key 1024  
Generating RSA private key, 1024 bit long modulus
.......++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

此时还不能签名,还需要通过私钥导出用来给其他公钥生成签名的根证书,如下:

OpenSSL> req -new -x509 -key ca.key -out ca.crt -days 365
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dahuyou
Email Address []:222@ff.com

这样,一个冒牌的CA就有了,可以使用ca.crt来签名生成证书了。
好,接着来生成证书啦:

OpenSSL> x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
Signature ok
subject=/C=CN/ST=BJ/L=beijing/O=hc/OU=bj/CN=dnogdashuaige/emailAddress=3454@qq.com
Getting CA Private Key
Enter pass phrase for ca.key:

这里生成的server.crt就是在https协议交互过程中服务端给客户端的证书了。

写在后面

参考文章列表

openssl生成自签名证书(完整版)。

分布式之拜占庭问题。

图文详解HTTPS协议通信全过程,结合抓包实战分析,带你一次看透HTTPS!零基础入门到精通,收藏这一篇就够了。

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

相关文章:

  • 智能开发新突破:大模型驱动的QAC与TESSY助手实战分享
  • 【工具变量】上市公司绿色供应链管理示范企业DID数据(2010-2024年)
  • phpstorm 操作git 另外的操作在 我的收藏
  • Maven动态控制版本号秘籍:高效发包部署,版本管理不再头疼!
  • Top 10 Kali Linux Tools for Hacking 2025.2
  • 《WINDOWS 环境下32位汇编语言程序设计》第11章 动态链接库和钩子
  • nano banana官方最强Prompt模板来了!六大场景模板详解
  • GEM5学习(4): 运行全系统模式的ARM系统
  • 如何构建企业级RAG知识库?实战方法、关键细节与平台选型
  • 只会刷App?大学生学透Android开发,直接开挂!
  • 【沉浸式解决问题】浮点数计算精度误差,round后值错误,0.1+0.2不等于0.3?
  • Ai Qwen3解答epochs多少为最佳 仅共参考
  • 机器视觉opencv总结
  • NuttX编译流程与config.h生成解析
  • 插入排序及希尔排序
  • AR智慧运维系统介绍
  • 【机器学习】实战:市场增长点分析挖掘项目
  • 算法模板(Java版)_链表(单链表、双链表)、栈和队列
  • HarmonyOS Stage 模型深度解析:构建现代化、高性能应用
  • IotDB批量数据脱敏DEMO
  • wpf 自定义控件,只能输入小数点,并且能控制小数点位数
  • 微服务多级缓存:从问题到实战(小白也能看懂的亿级流量方案)
  • FastJson
  • 技术框架之脚手架实现
  • .vsdx文件转pdf、word、ppt等文件在线分享(免费版)
  • Linux的墙上时钟和单调时钟的区别
  • Flutter环境搭建全攻略之-Macos环境搭建
  • Android 中自定义控件实现 AppCompatSpinner 功能
  • 面试复习题-Flutter场景题
  • 数据结构:双向链表