【八股】计算机网络-HTTP和HTTPS的区别、HTTPS加密传输原理

一、HTTP和HTTPS的基本概念

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲就是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用是可以分为两种:一种是简历一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

二、HTTP与HTTPS的区别

1、HTTPS协议需要到CA申请证书,一般免费的证书比较少,因而需要一定费用。

2、HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。

3、HTTP和HTTPS使用的是完全不同的链接方式,用的端口也不一样,前者是80端口,后者是443端口。

4、HTTP的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

三、HTTPS加密传输原理

1. 什么是HTTPS

1.1 https诞生的原因

HTTP 即超文本运输协议,是实现网络通信的一种规范.在实际应用中,HTTP常被用于在Web浏览器和网站服务器之间传递信息.

但是HTTP是以明文方式发送内容,不提供任何方式的数据加密,但这样的话,在传输过程中的每一个环节,数据都有可能被窃取或者篡改,这也意味着你和服务器之间还可能有个中间人,你们在通信过程中的一切内容都在中间人的掌握中,如下图

在这里插入图片描述鉴于 HTTP 的明文传输使得传输过程毫无安全性可言,出现了HTTPS进行加密.

1.2 https加密方式

https其实是让http运行在安全的SSL/TLS协议上,即 HTTPS = HTTP + SSL/TLS,通过SSL/TLS协议来验证服务器的身份,并为浏览器和服务器之间的通信进行加密.

SSL 协议位于HTTP和TCP之间的安全层,经过这个安全层的数据会被加密和解密,大致结构如下图:

在这里插入图片描述
从图中可以看出,HTTPS并非一个新的协议.

1.3.http和https的区别

  • http是明文传输,存在安全风险;https使用SSL/TLS协议进行加密和解密,使数据传输更具安全性
  • http的端口是80;https的端口是443;
  • 使用http的数据传输只要进行TCP的三次握手连接;使用https的除了TPC三次握手,还需要经过SSL/TLS的握手,才可进入加密传输;
  • https因为需要加密,需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的,而且功能越强大的证书费用越高

2. https的工作流程

  • 客户端发起https请求,连接服务端443端口;
  • 服务端有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等),在收到请求后会将数字证书信息发送给客户端(公钥在证书信息里面,私钥由服务器持有)
  • 客户端验证数字证书的有效性
  • 验证通过后,客户端会取出证书信息里面的公钥;利用公钥将自己随机生成的密钥进行加密并传输给服务端
  • 服务端收到加密后的数据,利用自己保留的私钥进行非对称解密,取出客户端的密钥.然后将用户请求的结果数据利用客户端的密钥进行加密,并传输给客户端,这样传输的数据都是加密的密文了
  • 客户端收到数据之后,用自己密钥进行对称解密,获取最后的明文数据.

在这里插入图片描述在这里插入图片描述

3. 数字证书

3.1 什么是数字证书

在上面流程中,有个叫数字证书的东西,那么这个是什么?有什么用呢?

通过对称和非对称混合方式,我们可以实现数据的加密传输。不过这种方式依然存在着问题,如果黑客通过 DNS 劫持将我们要访问官网的 IP 地址替换成了黑客的 IP 地址,当我们访问这个网站时其实就访问黑客的服务器了,黑客就可以在自己的服务器上实现公钥和私钥,而对浏览器来说,它完全不知道现在访问的是个黑客的站点。

所以针对这种情况,我们还需要服务器向浏览器提供证明“我就是我”,那怎么证明呢?这时候就需要一个权威机构,通过他颁发的证书来证明自己.

这个权威机构称为CA(Certificate Authority),颁发的证书就称为数字证书(Digital Certificate)

对于浏览器来说,数字证书有两个作用:一个是通过数字证书向浏览器证明服务器的身份,另一个是数字证书里面包含了服务器公钥。

3.2 如何申请数字证书

那么如何向 CA 申请证书。比如网站A需要向某个 CA 去申请数字证书,通常的申请流程分以下几步:

  • 首先 A 需要准备一套私钥和公钥,私钥留着自己使用;
  • 然后向 CA 机构提交公钥、公司、站点等信息并等待认证,这个认证过程可能是收费的;
  • CA 通过线上、线下等多种渠道来验证 A 所提供信息的真实性,如公司是否存在、企业是否合法、域名是否归属该企业等;
  • 如信息审核通过,CA 会向A签发认证的数字证书,包含了他的公钥、组织信息、CA 的信息、有效时间、证书序列号等,这些信息都是明文的,同时包含一个 CA 生成的签名。

3.3 如何验证证书有效性

在这里插入图片描述
首先了解CA签发证书的过程

  • CA先将网站A提交公钥、⽤途、颁发者、有效时间等信息打成⼀个包,然后对这些信息使用Hash算法进行计算,得到一个Hash值;
  • 然后CA使用自己的密钥将Hash值进行非对称加密,⽣成 Certificate Signature,也就是 CA 对证书做了签名
  • 最后将Certificate Signature 添加到证书上,形成数字证书

那么客户端校验服务端的数字证书的过程就可以按照这个流程反向操作:

  • 首先浏览器会读取证书中相关的明文信息,采用 CA 签名时相同的 Hash 函数来计算并得到一个Hash值 H1
  • 通常浏览器和操作系统中集成了 CA 的公钥信息,然后浏览器会使用CA公钥解密收到的证书签名,获得另一个Hash值 H2
  • 对比H1 和 H2 的值,如果相同,则证明证书合法;同时浏览器还会验证证书相关的域名信息、有效时间等信息
  • 这时候相当于验证了 CA 是谁,但是这个 CA 可能比较小众,浏览器不知道该不该信任它,然后浏览器会继续查找给这个 CA 颁发证书的 CA,再以同样的方式验证它上级 CA 的可靠性。通常情况下,操作系统中会内置信任的顶级 CA 的证书信息(包含公钥),如果这个 CA 链中没有找到浏览器内置的顶级的 CA,证书也会被判定非法。
    (内置 CA 对应的证书称为根证书,根证书是最权威的机构,它们自己为自己签名,我们把这称为自签名证书。)

四、小结

这篇文章首先介绍什么是https,http和https的区别;然后介绍了https的工作流程;最后介绍了什么是数字证书,以及数字证书如何申请和验证

### 计算机网络基础知识概述 #### OSI 七层模型简介 OSI(开放系统互连)是一个由国际标准化组织制定的参考模型,用于描述计算机网络通信的过程。该模型分为七个层次,每一层都有特定的功能职责[^1]。 - **物理层**:负责比特流的传输以及硬件接口的定义。 - **数据链路层**:提供节点间可靠的数据传输,并管理错误检测与纠正功能。 - **网络层**:主要负责将数据从源节点传输到目标节点,涉及逻辑地址分配路由选择等功能[^2]。 - **传输层**:确保端到端的数据可靠性,常见的协议有TCP UDP。 - **会话层**:建立、管理终止两个应用之间的对话。 - **表示层**:处理数据格式转换、加密解密等问题。 - **应用层**:直接面向用户提供服务,如HTTP、FTP等协议均属于这一层。 #### TCP/IP 协议栈详解 TCP/IP 是一种实际使用的网络体系结构,尽管通常被简化为四层模型,但它实际上可以映射至 OSI 的七层架构上: - **链路层/网络接入层**:对应于 OSI 中的物理层数据链路层。 - **网际层 (Internet Layer)** :相当于 OSI 的网络层,核心协议是 IPv4 或 IPv6。 - **运输层 (Transport Layer)** :实现可靠的进程间通信机制,典型代表就是 Transmission Control Protocol (TCP)[^3]。 - **应用层 (Application Layer)** :支持各种高层应用程序交互需求的服务设计,比如超文本传输协议(HTTP) 就运行在此级别之上[^4]。 #### HTTP 工作原理概览 HyperText Transfer Protocol (HTTP),即超文本传输协议,是一种客户端服务器模式下的请求响应标准(基于TCP)。每次浏览器访问网站都会发起一次完整的http事务流程: 1. 客户端向DNS查询域名对应的IP地址; 2. 使用三次握手过程建立起一条tcp连接通道; 3. 发送具体的GET或者POST方法类型的资源获取指令给web server; 4. Web Server解析后返回相应的内容体及其元信息头部字段构成的标准回复报文; 5. 断开链接结束本次操作; 以上每一步都可能涉及到多个中间环节参与协作完成最终目的——成功加载网页页面展示出来供用户浏览阅读[^5]。 ```python import socket def http_request(host, port=80): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: client_socket.connect((host, port)) request = f"GET / HTTP/1.1\r\nHost:{host}\r\nConnection:close\r\n\r\n" client_socket.sendall(request.encode('utf-8')) response = b"" while True: data = client_socket.recv(1024) if not data: break response += data print(response.decode()) finally: client_socket.close() if __name__ == "__main__": http_request("www.example.com") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别出BUG求求了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值