前言
本文主要介绍:
- HTTPS相较于HTTP更安全的原因
- 对称加密、非对称加密
- 摘要、数字证书+签名作用
- SSL/TLS 握手过程
- 服务器如何配置https
- 本地如何模拟生成证书,模拟https
希望大家看完之后,能对https有一个很好的理解。
1. 为什么需要https
1.1 http运行流程
我们先了解http为什么不安全,它的运行流程是什么,有什么弊端。
HTTP是属于应用层的协议,它是基于TCP/IP的,所以它只是规定一些要传输的内容,以及头部信息,然后通过TCP协议进行传输,依靠IP协议进行寻址,如图:
具体流程是:客户端发出请求,服务端进行响应。在整个过程中,数据都是明文形式传递,中间人可以进行拦截,造成安全隐患。
1.2 http有哪些风险
- 窃听风险
HTTP 传输的数据是明文。黑客很容易通过嗅探技术截获报文,由于数据没有加密,内容可以被黑客所理解。
- 篡改风险
黑客可以在截获 HTTP 报文后,对报文进行修改,然后再发送到服务器。
- 冒充风险
黑客可以伪造 HTTP 报文,假装自己是用户真正想要访问的网站,然后与用户进行通信。
1.3 安全通信的四大原则
不难猜到 HTTPS 就是为了解决上述三个风险而生的,一般我们认为安全的通信需要包括以下四个原则: 机密性 、完整性 ,身份认证 和不可否认。
- 机密性:HTTPS通过使用TLS进行加密的数据传输来提供机密性。这确保了在用户和服务器之间传输的所有数据都是加密的,防止在传输过程中被窃听者获取。
- 完整性:TLS协议提供一种消息摘要功能,比如使用HMAC,固定长度的哈希值可以证明数据在传输过程中没有被更改。
- 身份认证:HTTPS使用公钥证书对服务器进行身份验证。在TLS握手过程中,服务器将其公钥和证书发送给客户端。客户端可以通过证书颁发机构来验证服务器的身份。
- 不可否认: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握手过程:
第一次握手 客户端向服务器发起加密通信请求 ,内容主要包括:
- 客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
- 客户端生产的第一随机数 ,用于后续生成
会话密钥
和鉴别密钥
。 - 客户端支持的密码套件列表,每个密码套件包含:
用于传输会话密钥的非对称加密算法
,如 ECDHE、RSA;用于验证数字证书的非对称加密算法
,如 ECDHE、RSA;用于传输数据的对称加密算法
,如 AES_128_GCM、AES_128_CBC;用于验证报文完整性的摘要算法
,如 SHA256、SHA384;- 格式为:TLS_非对称加密算法_非对称加密算法_对称加密算法_摘要算法,如果两个非对称加密算法一致,可省略不写。
第二次握手
服务器收到客户端加密通信请求后,向客户端发出响应,内容主要包括:
- 确认的 SSL/ TLS 协议版本,如果双方支持的版本不同,则关闭加密通信。
- 服务器生产的第二随机数 ,用于后续生成
会话密钥
和鉴别密钥
。 - 确认的密码套件,如 TLS_RSA_WITH_AES128_CBC_SHA。
- 服务器发送数字证书+公钥
第三次握手
客户端收到服务器的回应之后,会验证其数字证书是否合法(验证方法在数字证书小节中有说明),如果证书合法,则进行第三次握手,内容主要包括:
- 客户端生产的第三随机数 (称为预主密钥,Pre-Master Secret,简写为 PMS),此随机数会被服务器
公钥
加密。
客户端根据随机数 1、随机数 2 以及预主密钥计算出会话密钥(Master Secret,MS)。 - 加密通信算法改变通知,表示之后数据都将用
会话密钥
进行加密。 - 客户端握手结束通知,表示客户端的握手阶段已经结束。客户端会生成所有握手报文数据的摘要,并用
会话密钥
加密后发送给服务器,用来供服务端校验。
第四次握手
服务器收到客户端的消息后,利用自己的 私钥
解密出预主密钥,并根据第一随机数、第二随机数 以及解密出来的预主密钥计算出会话密钥。
之后进行第四次握手,内容主要包括:
- 加密通信算法改变通知,表示之后数据都将用
会话密钥
进行加密。 - 服务器握手结束通知,表示服务器的握手阶段已经结束。服务器会生成所有握手报文数据的摘要,并用
会话密钥
加密后发送给客户端,用来供客户端校验。
最后双方使用对称加密进行加密传输:
至此,整个 SSL/TLS 的握手阶段全部结束!
完整过程如下所示:
其中最为关键的是:生成的预主密钥使用公钥加密,只能服务器的私钥进行解析,双方通过第一随机数+第二随机数+预主密钥生成会话密钥,黑客是无法进行破解得到预主密钥的。
为什么第三、第四次握手要发送所有握手报文的摘要呢?
主要原因是防止握手信息被篡改。比如客户端支持的密码套件列表中,有些加密算法较弱,有些加密算法较强,而此密码套件是明文传输的,万一黑客将此密码套件列表进行了修改,只留下一些安全性较低的加密算法,那么服务器就只能从这些安全性较低的加密算法中选择,安全性大大降低。因此需要通过发送摘要的形式防止握手信息被篡改。
为什么不直接发送一个主密钥,而是用两个随机数加一个前主密钥重新生成一个主密钥呢?
主要原因是防止连接重放 。如果没有前面两个随机数,仅仅由客户端生成一个主密钥,并通过服务器 公钥
加密发送给服务器。那么黑客在嗅探了服务器与客户端之间的所有报文后,可以再次冒充客户端向服务器发送相同的报文(虽然黑客不知道内容是什么),因为报文信息都是之前客户端和服务器验证过的,因此服务器会认为是客户端与其通信,导致又一次连接。
4. 服务器如何配置https
-
申请https证书,以阿里云为例,申请免费的ssl证书:
-
申请后下载证书文件
下载完成后得到,以nginx为例:
vbnet
xxx.key:私钥
xxx.pem:证书
- 放入服务器中,配置nginx即可:
js
server {
listen 443 ssl;
server_name xxx.com;
ssl_certificate xxx.pem;
ssl_certificate_key xxx.key;
}
5. 本地如何模拟https
5.1 生成ssl证书和密钥
- 安装OpenSSL:首先,您需要在您的计算机上安装OpenSSL工具。OpenSSL是一个开源的软件包,用于生成和管理SSL证书。
- mac不需要安装
- windows www.openssl.org/source/
-
生成私钥:使用以下命令生成一个私钥文件(xxx.key):
csharpopenssl genrsa -out private.key 2048
这将生成一个2048位的RSA私钥文件。
-
创建证书签名请求(CSR):使用以下命令生成一个证书签名请求文件(xxx.csr):
vbnetopenssl req -new -key private.key -out certificate.csr
在生成CSR时,您将需要填写一些相关的信息,如组织名称、国家/地区、城市、常用名称等。
-
自签名证书生成:使用以下命令生成一个自签名的证书文件(xxx.crt):
csharpopenssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt
这将生成一个有效期为365天的自签名证书文件。
-
完成:通过以上步骤,您已经生成了一个自签名的SSL证书文件(certificate.crt)和其对应的私钥文件(private.key)。
注意事项:
- 自签名证书在本地开发和测试环境中使用是可行的,且生成过程中需要设置密码。
5.2 Docker模拟环境
- 创建测试目录结构
arduino
./
├─Dockerfile
├─certificate.crt // 证书
├─certificate.csr // 签名请求文件(不需要了)
├─index.html // 入口文件
├─nginx.conf // nginx 配置文件
└private.key // 私钥
- 使用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>
- 生成镜像并运行
生成镜像:docker build -t f5l5y5/https .
运行:docker run -d -p 443:443 --name https f5l5y5/https
- 测试
因为证书未经过认证,所以有安全提示
继续点击
6、总结
总的来说,HTTPS是为了提供更为安全的网络通信,通过数字证书加签名,以及TLS协议来实现的。
-
知道HTTP的运行流程和它的风险。介绍对称加密和非对称加密。
- 对称加密:使用相同的密钥进行加密和解密,运算速度快,适合大量数据的加密和解密。
- 非对称加密:使用一对公钥和私钥进行加密和解密,提供更高的安全性,但处理速度较慢。
-
HTTPS通过创建数字证书和签名来防止证书被伪造。证书由权威的第三方机构(CA)颁发,并包含域名、申请人、公钥等信息。使用数字签名可以防止证书被替换或者修改。
-
HTTPS 采用混合加密方式,用非对称加密算法传输密钥,用对称加密算法传输实际数据
对称加密算法的弱点在于协商密钥的过程采用明文不安全,存在密钥泄漏的可能,我们是不是可以不采用明文,而是采用非对称加密算法来协商此密钥,之后传输数据时再采用对称加密算法进行加密。
- 会话密钥通过非对称加密算法传输,非常
安全
- 大量数据通过对称加密算法传输(多次),会话密钥只需要传一次,
传输速度快
- 会话密钥通过非对称加密算法传输,非常
-
通过SSL/TLS协议,HTTPS在应用层和传输层之间进行加密,实现安全通信。SSL/TLS握手过程中,服务器和客户端会交换随机数和预主密钥,并生成会话密钥,以此提高通信的安全性。
-
如何在服务器上配置HTTPS,以及在本地模拟HTTPS环境的方法。在实践中,我们需要申请和下载HTTPS证书,设置Nginx。在本地测试时,我们生成自己的SSL证书和密钥,并利用Docker进行模拟。
如有错误,请大家指正。希望对你有一点帮助^O^!
参考文章