一文了解HTTPS运行过程、使用

前言

本文主要介绍:

  1. HTTPS相较于HTTP更安全的原因
  2. 对称加密、非对称加密
  3. 摘要、数字证书+签名作用
  4. SSL/TLS 握手过程
  5. 服务器如何配置https
  6. 本地如何模拟生成证书,模拟https

希望大家看完之后,能对https有一个很好的理解。

1. 为什么需要https

1.1 http运行流程

我们先了解http为什么不安全,它的运行流程是什么,有什么弊端。

HTTP是属于应用层的协议,它是基于TCP/IP的,所以它只是规定一些要传输的内容,以及头部信息,然后通过TCP协议进行传输,依靠IP协议进行寻址,如图:

具体流程是:客户端发出请求,服务端进行响应。在整个过程中,数据都是明文形式传递,中间人可以进行拦截,造成安全隐患。

1.2 http有哪些风险

  1. 窃听风险

HTTP 传输的数据是明文。黑客很容易通过嗅探技术截获报文,由于数据没有加密,内容可以被黑客所理解。

  1. 篡改风险

黑客可以在截获 HTTP 报文后,对报文进行修改,然后再发送到服务器。

  1. 冒充风险

黑客可以伪造 HTTP 报文,假装自己是用户真正想要访问的网站,然后与用户进行通信。

1.3 安全通信的四大原则

不难猜到 HTTPS 就是为了解决上述三个风险而生的,一般我们认为安全的通信需要包括以下四个原则: 机密性完整性身份认证不可否认

  1. 机密性:HTTPS通过使用TLS进行加密的数据传输来提供机密性。这确保了在用户和服务器之间传输的所有数据都是加密的,防止在传输过程中被窃听者获取。
  2. 完整性:TLS协议提供一种消息摘要功能,比如使用HMAC,固定长度的哈希值可以证明数据在传输过程中没有被更改。
  3. 身份认证:HTTPS使用公钥证书对服务器进行身份验证。在TLS握手过程中,服务器将其公钥和证书发送给客户端。客户端可以通过证书颁发机构来验证服务器的身份。
  4. 不可否认:HTTPS使用SSL/TLS协议中的数字签名来提供不可抵赖性。数字签名用于验证通信内容的来源和完整性,防止发送方或接收方否认其行为。

接下来我们来看看 HTTPS 是如何实现以满足安全通信原则的。

2. 加密方式

2.1 对称加密

使用相同的密钥用于加密和解密数据。

常见的对称加密算法包括DES、AES和RC4等。

对称加密优点:速度较快,适合用于大量数据的加密和解密。

问题:如何解决公钥拦截问题,引入非对称加密。

2.2 非对称加密

使用一对公钥和私钥进行加密和解密。公钥用于加密数据,私钥用于解密数据。

常见的非对称加密算法包括RSA和Elliptic Curve Cryptography(ECC)等。

非对称加密优点:提供了更高的安全性,但速度较慢,适合用于密钥交换和数字签名等场景。

因为非对称加密密钥传输不安全,服务器会生成一对公钥和私钥。公钥会发送给客户端,而私钥将被服务器保密。

公钥是任何一个客户端都能获取的,私钥只能服务器知道,尽管黑客获取了公钥也无法破解加密内容。

但是他也存在问题,当黑客进行拦截,换成自己的公钥给客户端,那么客户端发送给服务器的信息被解析,比如转账100给什么人,可以转账10000给中间人使用服务器的公钥加密给服务器。

问题:客户端如何认证公钥真假?

2. 数字证书+签名

2.1 数字证书

客户端如何验证公钥真假,就需要东西证明。就像我们找工作时的学历证书,显然不是任意的东西都可以,证书是由教育部即第三方权威机构(Certificate Authority,简称 CA)颁发,申请证书需要提交域名、申请人信息、公钥发送到CA申请生成证书。

问题: 如何验证证书的真实性,如果仅用证书摘要进行解析,会有替换的风险。因为摘要算法是公开的,黑客可以替换掉证书明文,再根据证书上的摘要算法计算出摘要后把证书上的摘要也给替换掉!这样 客户端拿到证书后计算摘要发现一样,误以为此证书是合法就中招了

2.2 数字签名

就类似于学历证书可以伪造,但是学历证书编号是可以在学信网上查辨证书真伪。

学历编号其实就是我们常说的数字签名,可以防止证书造假。

所以关键是要用 CA 的私钥给摘要进行加密生成签名,客户端得用 CA 的公钥来给签名解密,拿到的才是未经篡改合法的摘要(私钥签名,公钥才能解密)。

签名过程如下:

验证逻辑如下:

那么问题来了,客户端如何得到认证中心的公钥呢?万一此公钥是被伪造的呢?为了防止套娃,实际电脑操作系统中会内置这些认证中心的公钥!因而无需担心认证中心公钥被伪造的问题。

2.3 总结

  • 在自己的服务器上生成一对公钥和私钥。然后将域名、申请者、公钥(注意不是私钥,私钥是无论如何也不能泄露的)等其他信息整合在一起,生成.csr 文件。
  • 将这个 .csr 文件发给 CA 机构,CA 机构收到申请后,会通过各种手段验证申请者的组织信息和个人信息,如无异常(组织存在,企业合法,确实是域名的拥有者),CA 就会使用散列算法对.csr里的明文信息先做一个HASH,得到一个信息摘要,再用 CA 自己的私钥对这个信息摘要进行加密,生成一串密文,密文即是所说的 签名。签名 + .csr 明文信息,即是 证书。CA 把这个证书返回给申请人。
  • 客户端拿到证书后,用同样的摘要算法对证书明文计算摘要,再用CA的公钥来给签名解密,拿到的才是未经篡改合法的摘要,两者一致确保证书不被替换修改。 因为客户端除了通过验签的方式验证证书是否合法之外,还需要验证证书上的域名与自己的请求域名是否一致,中间人中途虽然可以替换自己向 CA 申请的合法证书,但此证书中的域名与客户端请求的域名不一致,客户端会认定为不通过!

3、SSL/TSL

3.1 什么是SSL/TSL

SSL(Secure Sockets Layer)和TLS(Transport Layer Security)都是用于加密和保护网络通信的安全协议。

SSL是早期使用,现在都使用TSL协议。TSL协议是在应用层和传输层之间进行加密的。

通信的整体流程:

3.2 SSL/TSL握手过程

使用wireshark进行抓包,分析TSL握手过程:

第一次握手 客户端向服务器发起加密通信请求 ,内容主要包括:

  1. 客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
  2. 客户端生产的第一随机数 ,用于后续生成 会话密钥鉴别密钥
  3. 客户端支持的密码套件列表,每个密码套件包含:
    1. 用于传输会话密钥的非对称加密算法,如 ECDHE、RSA;
    2. 用于验证数字证书的非对称加密算法,如 ECDHE、RSA;
    3. 用于传输数据的对称加密算法,如 AES_128_GCM、AES_128_CBC;
    4. 用于验证报文完整性的摘要算法,如 SHA256、SHA384;
    5. 格式为:TLS_非对称加密算法_非对称加密算法_对称加密算法_摘要算法,如果两个非对称加密算法一致,可省略不写。

第二次握手

服务器收到客户端加密通信请求后,向客户端发出响应,内容主要包括:

  1. 确认的 SSL/ TLS 协议版本,如果双方支持的版本不同,则关闭加密通信。
  2. 服务器生产的第二随机数 ,用于后续生成 会话密钥鉴别密钥
  3. 确认的密码套件,如 TLS_RSA_WITH_AES128_CBC_SHA。
  1. 服务器发送数字证书+公钥

第三次握手

客户端收到服务器的回应之后,会验证其数字证书是否合法(验证方法在数字证书小节中有说明),如果证书合法,则进行第三次握手,内容主要包括:

  1. 客户端生产的第三随机数 (称为预主密钥,Pre-Master Secret,简写为 PMS),此随机数会被服务器 公钥加密。
    客户端根据随机数 1、随机数 2 以及预主密钥计算出会话密钥(Master Secret,MS)。
  2. 加密通信算法改变通知,表示之后数据都将用 会话密钥进行加密。
  3. 客户端握手结束通知,表示客户端的握手阶段已经结束。客户端会生成所有握手报文数据的摘要,并用 会话密钥加密后发送给服务器,用来供服务端校验。

第四次握手

服务器收到客户端的消息后,利用自己的 私钥解密出预主密钥,并根据第一随机数、第二随机数 以及解密出来的预主密钥计算出会话密钥。

之后进行第四次握手,内容主要包括:

  1. 加密通信算法改变通知,表示之后数据都将用 会话密钥进行加密。
  2. 服务器握手结束通知,表示服务器的握手阶段已经结束。服务器会生成所有握手报文数据的摘要,并用 会话密钥加密后发送给客户端,用来供客户端校验。

最后双方使用对称加密进行加密传输:

至此,整个 SSL/TLS 的握手阶段全部结束!

完整过程如下所示:

其中最为关键的是:生成的预主密钥使用公钥加密,只能服务器的私钥进行解析,双方通过第一随机数+第二随机数+预主密钥生成会话密钥,黑客是无法进行破解得到预主密钥的。

为什么第三、第四次握手要发送所有握手报文的摘要呢?

主要原因是防止握手信息被篡改。比如客户端支持的密码套件列表中,有些加密算法较弱,有些加密算法较强,而此密码套件是明文传输的,万一黑客将此密码套件列表进行了修改,只留下一些安全性较低的加密算法,那么服务器就只能从这些安全性较低的加密算法中选择,安全性大大降低。因此需要通过发送摘要的形式防止握手信息被篡改。

为什么不直接发送一个主密钥,而是用两个随机数加一个前主密钥重新生成一个主密钥呢?

主要原因是防止连接重放 。如果没有前面两个随机数,仅仅由客户端生成一个主密钥,并通过服务器 公钥加密发送给服务器。那么黑客在嗅探了服务器与客户端之间的所有报文后,可以再次冒充客户端向服务器发送相同的报文(虽然黑客不知道内容是什么),因为报文信息都是之前客户端和服务器验证过的,因此服务器会认为是客户端与其通信,导致又一次连接。

4. 服务器如何配置https

  1. 申请https证书,以阿里云为例,申请免费的ssl证书:

  2. 申请后下载证书文件

下载完成后得到,以nginx为例:

vbnet 复制代码
xxx.key:私钥
xxx.pem:证书
  1. 放入服务器中,配置nginx即可:
js 复制代码
server {
    listen 443 ssl;
    server_name xxx.com;

    ssl_certificate    xxx.pem;
    ssl_certificate_key xxx.key;
}

5. 本地如何模拟https

5.1 生成ssl证书和密钥

  1. 安装OpenSSL:首先,您需要在您的计算机上安装OpenSSL工具。OpenSSL是一个开源的软件包,用于生成和管理SSL证书。
  1. 生成私钥:使用以下命令生成一个私钥文件(xxx.key):

    csharp 复制代码
    openssl genrsa -out private.key 2048

    这将生成一个2048位的RSA私钥文件。

  2. 创建证书签名请求(CSR):使用以下命令生成一个证书签名请求文件(xxx.csr):

    vbnet 复制代码
     openssl req -new -key private.key -out certificate.csr

    在生成CSR时,您将需要填写一些相关的信息,如组织名称、国家/地区、城市、常用名称等。

  3. 自签名证书生成:使用以下命令生成一个自签名的证书文件(xxx.crt):

    csharp 复制代码
    openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt

    这将生成一个有效期为365天的自签名证书文件。

  4. 完成:通过以上步骤,您已经生成了一个自签名的SSL证书文件(certificate.crt)和其对应的私钥文件(private.key)。

注意事项:

  • 自签名证书在本地开发和测试环境中使用是可行的,且生成过程中需要设置密码。

5.2 Docker模拟环境

  1. 创建测试目录结构
arduino 复制代码
./
├─Dockerfile
├─certificate.crt // 证书
├─certificate.csr // 签名请求文件(不需要了)
├─index.html // 入口文件
├─nginx.conf // nginx 配置文件
└private.key // 私钥
  1. 使用Docker进行模拟,写配置文件

Dockerfile:

bash 复制代码
# 设置基础镜像
FROM nginx

# 复制证书和私钥到容器中
COPY certificate.crt /etc/nginx/ssl/certificate.crt
COPY private.key /etc/nginx/ssl/private.key

# 复制Nginx配置文件到容器中
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 复制首页
COPY index.html /etc/nginx/html/index.html


# 暴露443端口
EXPOSE 443

# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]

nginx.conf:

ini 复制代码
server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;

    location / {
      root /etc/nginx/html;
      index index.html;
    }
}

index.html:

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>HTTPS</title>
</head>
<body>
	<h1>https实验</h1>
</body>
</html>
  1. 生成镜像并运行

生成镜像:docker build -t f5l5y5/https .

运行:docker run -d -p 443:443 --name https f5l5y5/https

  1. 测试

因为证书未经过认证,所以有安全提示

继续点击

6、总结

总的来说,HTTPS是为了提供更为安全的网络通信,通过数字证书加签名,以及TLS协议来实现的。

  1. 知道HTTP的运行流程和它的风险。介绍对称加密和非对称加密。

    1. 对称加密:使用相同的密钥进行加密和解密,运算速度快,适合大量数据的加密和解密。
    2. 非对称加密:使用一对公钥和私钥进行加密和解密,提供更高的安全性,但处理速度较慢。
  2. HTTPS通过创建数字证书和签名来防止证书被伪造。证书由权威的第三方机构(CA)颁发,并包含域名、申请人、公钥等信息。使用数字签名可以防止证书被替换或者修改。

  3. HTTPS 采用混合加密方式,用非对称加密算法传输密钥,用对称加密算法传输实际数据

    对称加密算法的弱点在于协商密钥的过程采用明文不安全,存在密钥泄漏的可能,我们是不是可以不采用明文,而是采用非对称加密算法来协商此密钥,之后传输数据时再采用对称加密算法进行加密。

    • 会话密钥通过非对称加密算法传输,非常 安全
    • 大量数据通过对称加密算法传输(多次),会话密钥只需要传一次,传输速度快
  4. 通过SSL/TLS协议,HTTPS在应用层和传输层之间进行加密,实现安全通信。SSL/TLS握手过程中,服务器和客户端会交换随机数和预主密钥,并生成会话密钥,以此提高通信的安全性。

  5. 如何在服务器上配置HTTPS,以及在本地模拟HTTPS环境的方法。在实践中,我们需要申请和下载HTTPS证书,设置Nginx。在本地测试时,我们生成自己的SSL证书和密钥,并利用Docker进行模拟。

如有错误,请大家指正。希望对你有一点帮助^O^!


参考文章

HTTPS终于搞懂了

数字证书、签名到底是什么?

20 张图彻底弄懂 HTTPS 的原理

看图学HTTPS

SSL和TSL

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

相关推荐
理想不理想v10 分钟前
vue经典前端面试题
前端·javascript·vue.js
不收藏找不到我11 分钟前
浏览器交互事件汇总
前端·交互
YBN娜25 分钟前
Vue实现登录功能
前端·javascript·vue.js
阳光开朗大男孩 = ̄ω ̄=25 分钟前
CSS——选择器、PxCook软件、盒子模型
前端·javascript·css
minDuck29 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
小政爱学习!1 小时前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
魏大帅。1 小时前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
花花鱼1 小时前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端