Http 存在不安全、无状态、性能低、可伪造等问题,为了解决Http
的这些缺点,发展出了HTTPS
协议,它在HTTP
的基础上增加了安全性,通过使用SSL/TLS
协议对数据进行加密和认证,提供了更安全的数据传输方式。
HTTPS(Hypertext Transfer Protocol Secure)是一种基于HTTP协议的安全传输协议。它通过使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议对数据进行加密和认证,提供了更安全的数据传输方式。
HTTPS = HTTP + SSL/TLS
尽管HTTPS提供了更安全的数据传输方式,但它也会增加服务器的负载和网络延迟,因为加密和解密数据需要额外的计算资源。
SSL(Secure Sockets Layer)是一种用于保护网络通信安全的协议。它位于传输层和应用层之间,为应用层协议(如HTTP、SMTP、FTP等)提供安全性支持。
SSL的主要功能包括以下几个方面:
TLS是SSL的升级版,进行了一些改进和优化,广泛使用的是TLS,如今他的版本已经来到1.3了。
发送和接收使用相同的密钥来对数据进行加密和解密,这样被称为对称加密。
具体流程:
常见的对称加密算法有:
非对称加密使用一对密钥(公钥和私钥)来进行加密和解密。在非对称加密中,公钥用于加密数据,而私钥用于解密数据。
具体流程:
非对称加密算法有:
openSSL工具的安装
下载地址:openSSL
证书相关操作
这里需要三个文件来完成证书相关操作:
SSL/TLS证书文件一般使用第三方(阿里云、华为云、腾讯云)提供的SSL/TLS证书,这里用openssl模拟了,这会使当前访问地址不安全,因为这里生成的证书没有被受信
生成私钥文件:
openssl genpkey -algorithm RSA -out private-key.pem -aes256
在之后需要一个密码短语并确认,在后续需要操作密钥文件的时候需要。
Enter PEM pass phrase: 123456
Verifying - Enter PEM pass phrase: 123456
生成证书签名请求文件:
openssl req -new -key private-key.pem -out certificate.csr
填写信息:
Country Name (2 letter code) []:CN 国家
State or Province Name (full name) []:CQ 省份
Locality Name (eg, city) []:CQ 城市
Organization Name (eg, company)SMZ 组织或者是个人
Organizational Unit Name (eg, section) []:Min 机构名称
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 []: SMZSMZSMZSMZ 密码加盐
An optional company name []:Min 公司名称
生成SSL/TLS证书文件:
openssl x509 -req -in certificate.csr -signkey private-key.pem -out certificate.pem
Https端口默认为443,配置好密钥和证书以及密码短语就可以启动服务了
const https = require('https')
const fs = require('node:fs')
// http端口默认80 , https端口默认443
https.createServer({
key:fs.readFileSync('private-key.pem'),
cert:fs.readFileSync('certificate.pem'),
//密码短语
passphrase: '123456'
},(req,res)=>{
res.writeHead(200)
res.end('success')
}).listen(443,()=>{
console.log('https server is running at https://localhost:443')
})
在nginx文件下的conf中nginx.conf配置文件中修改配置。
找到https相关配置部分,niginx已经将配置写好了的,只需要调整。
生成过程和上面的步骤差不多,只不过没有了密码短语。
# HTTPS server
#
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;
}
}
之后启动nginx服务,就可以访问了。
总之,HTTPS是一种重要的安全传输协议,可以提供更安全的数据传输方式。在保护敏感信息和建立可信任的通信时,使用HTTPS是一个值得推荐的选择。