HTTPS

概述

HTTPS (Hypertext Transfer Protocol Secure),是一种通过加密通道传输数据的安全协议

它是HTTP协议的安全版本,用于在Web浏览器和Web服务器之间进行安全的数据传输

HTTPS在传输过程中使用SSL (Secure Sockets Layer)或TLS (Transport Layer Security)协议加密数据,确保敏感信息在传输过程中不会被窃取或篡改

HTTPS = HTTP + TLS/SSL

HTTP VS HTTPS

  • HTTP通信使用明文(不加密),内容可能会被盗用;而HTTPS加密了信息
  • HTTP不验证通信方的身份,因此有可能遭遇伪装;而HTTPS加入了身份验证
  • HTTP无法证明报文的完整性,所以有可能已遭篡改;而HTTPS存在完整性校验

TLS SSL

概述

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

它们都提供了加密和认证机制,用于确保数据传输的机密性和完整性

SSL是最早的安全协议,而TLS是在SSL的基础上发展起来的,解决了SSL存在的一些安全性问题

TLS将对称加密、非对称加密、散列函数三种加密方式融合使用,安全性非常高

目前广泛使用的TLS版本是TLS 1.2和TLS 1.3,TLS 1.3是最新的协议版本,在安全性、性能和功能方面有一些改进

TLS/SSL在应用层的下面、传输层的上面进行加密

应用

  • 加密通信:TLS/SSL使用加密算法来对数据进行加密,防止第三方截获和窃听通信内容,可以确保数据在传输过程中的隐私性
  • 身份认证:TLS/SSL提供了身份验证机制,用于确认通信双方的身份,并确保数据只发送到正确的接收方,可以防止恶意用户冒充其他用户或服务器

加密

对称加密

常见的算法有AES、DES加密

例如野兽向远野发消息,但他们的消息不想被别人知道,于是他们两个协商了一段密钥“114514”,进行对称加密

野兽:AES算法 + 密钥 (114514) + 明文(只有红茶可以吗) = AIEGHORPAGAG

远野:使用AES + 密钥(今生永相随)+密文 (AIEGHORPAGAG) = 只有红茶可以吗

非对称加密

常见算法有RSA、DSA加密

还是野兽向远野发消息,这次使用非对称加密,生成了公钥和私钥,公钥可以对外公开,私钥必须只能管理员知道,不能泄露

野兽:RSA + 公钥 + 明文(只有红茶可以吗) = RHRSTJA

远野:RSA + 私钥 + 密文 (RHRSTJA) = 只有红茶可以吗

Open SSL

Open SSL可以用来生成证书和私钥,Mac电脑自带,Windows需要下载

在SSL/TLS加密通信中,一般需要使用三个文件来完成证书相关操作:

  • 私钥文件(例如 “private-key.pem”),用于对加密数据进行解密操作
  • 证书签名请求文件(例如 “certificate.csr”),用于向CA申请SSL/TLS证书签名
  • SSL/TLS 证书文件(例如 “certificate.pem”),用于对客户端发送的请求进行验证,以确保通信安全可靠

通过使用这三个文件进行密钥交换和身份验证,SSL/TLS可以实现加密通信、抵御可能的中间人攻击,提高了通信的安全性和保密性

开发、测试环境可以使用Open SSL模拟HTTPS环境,但项目上线时还是需要使用第三方机构颁发的证书

创建私钥

1
openssl genpkey -algorithm RSA -out private-key.pem -aes256
  • openssl: OpenSSL命令行工具的名称
  • genpkey: 生成私钥的命令
  • -algorithm RSA: 指定使用的算法,此处生成RSA私钥
  • -out private-key.pem: 将生成的私钥保存为private-key.pem文件
  • -aes256: 为私钥添加AES 256位加密,以保护私钥文件,不被未经授权的人访问

Enter PEM pass phrase: 输入密码短语,生成pem文件时需要它,记住不要忘

生成PEM证书文件

1
openssl req -new -key private-key.pem -out certificate.csr
  • req: 使用X.509证书请求管理器 (Certificate Request Management) 功能模块
  • -new: 生成新的证书签名请求
  • -key private-key.pem: 使用指定的私钥文件private-key.pem,来加密证书签名请求中的密钥对
  • -out certificate.csr: 输出生成的证书签名请求到文件certificate.csr中,该文件中包含了申请者提供的一些证书请求信息,例如公钥、授权主体的身份信息等
  • Country Name (2 letter code) []: 输入国家代号
  • State or Province Name (full name) []: 输入省份代号
  • Locality Name (eg, city) []: 输入城市代号
  • Organization Name (eg, company): 输入组织或者是个人
  • Organizational Unit Name (eg, section) []: 输入机构名称
  • Common Name (eg, fully qualified host name) []: 输入域名
  • Email Address []: 输入邮箱地址
  • A challenge password []: 输入密码的加盐

生成数字证书

1
openssl x509 -req -in certificate.csr -signkey private-key.pem -out certificate.pem
  • x509: 使用X.509证书管理器功能模块
  • -req: 从输入文件(此处为certificate.csr)中读取证书签名请求数据
  • -in certificate.csr: 指定要读取的证书签名请求文件名
  • -signkey private-key.pem: 使用指定的私钥文件private-key.pem进行签名操作,一般来说,签名证书的私钥应该会和之前生成CSR的私钥对应
  • -out certificate.pem: 将签名后的证书输出到文件certificate.pem中,该文件包含了签名后的证书信息,包括签名算法、有效期、公钥、授权主体的身份信息等

Enter pass phrase for private-key.pem: 输入密码短语

测试HTTPS

NodeJS接口测试HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import https from 'https'
import fs from 'node:fs'

// 创建https服务
// HTTP端口默认80;HTTPS默认443
https.createServer({
key: fs.readFileSync("private-key.pem"),
cert: fs.readFileSync("certificate.pem"),
// 密码短语
passphrase: '114514'
}, (req,res)=> {
res.writeHead(200),
res.end('success!')
}).listen(443, ()=> {
console.log('https server is running at https://localhost:443')
})

Nginx配置HTTPS

如果在windows使用Nginx配置HTTPS,则私钥不能设置密码(有bug)

1
2
3
openssl genrsa -out nginx.key 2048 # 生成私钥,使用rsa生成的私钥没有密码
openssl req -new -key nginx.key -out nginx.csr # 生成签名文件
openssl x509 -req -in nginx.csr -signkey nginx.key -out nginx.crt # 生成证书
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 server {
listen 443 ssl;
server_name localhost;

# 默认被注释,打开它并填入内容即可
ssl_certificate nginx.crt;
ssl_certificate_key nginx.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

location / {
root html;
index index.html index.htm;
}
}