SSL TLS HTTPS
来源:前端-网络课程
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 | import https from 'https' |
Nginx配置HTTPS
如果在windows使用Nginx配置HTTPS,则私钥不能设置密码(有bug)
1 | openssl genrsa -out nginx.key 2048 # 生成私钥,使用rsa生成的私钥没有密码 |
1 | server { |