HTTPS
HTTPS,全称为 Hypertext Transfer Protocol Secure,是一种通过加密通道传输数据的安全协议。它是 HTTP 协议的安全版本,用于在 Web 浏览器和 Web 服务器之间进行安全的数据传输。HTTPS 在传输过程中使用了 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议来加密数据,确保敏感信息在传输过程中不会被窃取或篡改。
http 缺点
通信使用明文(不加密),内容可能会被盗用
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改
https
信息加密
完整性校验
身份验证
HTTPS = http + TLS/SSL
TLS SSL
TLS(Transport Layer Security)和 SSL(Secure Sockets Layer)是用于保护网络通信的安全协议。它们都提供了加密和认证机制,用于确保数据传输的机密性和完整性。
SSL 是最早的安全协议,而 TLS 是在 SSL 的基础上发展起来的。目前广泛使用的版本是 TLS 1.2 和 TLS 1.3。TLS 1.3 是最新的协议版本,在安全性、性能和功能方面有一些改进。
TLS 和 SSL 主要用于以下两个方面:
- 加密通信:TLS/SSL 使用加密算法来对数据进行加密,防止第三方截获和窃听通信内容。它可以确保数据在传输过程中的隐私性。
- 身份认证:TLS/SSL 还提供了身份验证机制,用于确认通信双方的身份,并确保数据只发送到正确的接收方。这可以防止恶意用户冒充其他用户或服务器。
SSL 是最早的用来做https
TLS 是SSL升级版 提高了安全性 并解决了SSL存在的一些安全性问题
SSl/TLS 工作原理类似的
HTTP
TLS/SSL 安全层
TCP
加密
- 对称加密
常见的算法有 AES DES 加密
举例 麒麟
->星月
发消息 但是他们的消息不想被别人知道,采用了对称加密,于是他们两个协商了一段密钥,今生永相随
麒麟:AES算法 + 密钥(今生永相随)+明文(吃面) = XMZSXMZS==
星月:使用AES + 密钥(今生永相随)+密文( XMZSXMZS==) = 吃面
- 非对称加密
常见算法有RSA DSA 加密
举例 麒麟
->星月
发消息,这次使用的是非对称加密,生成了公钥和私钥,公钥可以对外公开,私钥必须只能麒麟
知道不能泄露。
星月:RSA + 公钥 + 明文(吃面) = XMZS==
麒麟:RSA + 私钥 + 密文(XMZS==) = 吃面
openSSL 生成私钥
openSSL 安装
Mac电脑自带了
windows
https://www.openssl.org/source/
在 SSL/TLS 加密通信中,一般需要使用三个文件来完成证书相关操作,即:
- 私钥文件(例如 “private-key.pem”),用于对加密数据进行解密操作。
- 证书签名请求文件(例如 “certificate.csr”),用于向 CA 申请 SSL/TLS 证书签名。
- SSL/TLS 证书文件(例如 “certificate.pem”),用于对客户端发送的请求进行验证,以确保通信安全可靠。
私钥文件用于对数据进行解密操作,保证了通信的机密性;证书签名请求文件包含了请求者的身份信息和公钥等信息,需要被发送给 CA 进行签名,从而获取有效的 SSL/TLS 证书;SSL/TLS 证书文件则包含了签名后的证书信息,被用于客户端和服务器之间的身份验证,以确保通信的安全性和可靠性。
通过使用这三个文件进行密钥交换和身份验证,SSL/TLS 可以实现加密通信以及抵御可能的中间人攻击,提高了通信的安全性和保密性。
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 qwe123 密码短语生成pem文件的时候需要
生成pem 证书文件
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) []:CN 国家
State or Province Name (full name) []:BJ 省份
Locality Name (eg, city) []:BJ 城市
Organization Name (eg, company)ZMY 组织或者是个人
Organizational Unit Name (eg, section) []:XMKJ 机构名称
Common Name (eg, fully qualified host name) []:localhost 域名
Email Address []: 邮箱地址
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: 密码加盐 XMZSXMZSXMZS
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: 密码短语
nodejs接口测试https
引入生成好的两个文件 certificate.pem private-key.pem
import https from 'node:https' import fs from 'node:fs' https.createServer({ key: fs.readFileSync('private-key.pem'), cert: fs.readFileSync('certificate.pem'), //密码短语 passphrase: 'qwe123' }, (req, res) => { res.writeHead(200) res.end('success') }).listen(443,()=>{ console.log('server is running') })
nginx配置https
终极大坑 如果在windows使用nginx配置https 私钥不能设置密码
- openssl genrsa -out nginx.key 2048 (生成私钥)
- openssl req -new -key nginx.key -out nginx.csr(生成签名文件)
- openssl x509 -req -in nginx.csr -signkey nginx.key -out nginx.crt(生成证书)
在nginx配置文件
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; } }