【知识背景】
现在的网站但凡涉及到一些安全信息的都会走https协议(http + TLS)。这里的TLS(Transport Layer Security)指的是应用于传输层(TCP这层)的安全协议。
https安全的原因在于他在传输的过程中对数据进行了加密,用抓包工具抓到的数据包的内容是加密过的(如果是HTTP的话的都是明文)。试想下,如果不用https,直接用wireshark这类抓包工具监听网卡上的信息,所有的信息包括用户名和密码都被抓去了,那登录验证的机制岂不是形同虚设?这就是https存在的意义。
对称算法和非对称算法
定义:能通过一个秘钥,双向加密和解密的算法称为对称算法(RC2,Base64);需要通过一对秘钥(公钥加密,私钥解密)加密和解密的算法称为非对称算法(MD5,HASH,RSA)。
这里讲下HTTPS的大致流程。
- 客户端先下载服务端的数字证书(包含加密公钥)。
- 客户端随机生成一个值(内容秘钥),通过数字证书中预置的公钥(传输公钥)进行加密后传输给服务端。
- 服务端接受到信息后,用(传输私钥)进行解密获得内容私钥。之后双方基于这个内容私钥通过对称算法进行内容的加密和解密(用对称算法的原因是因为开销小),传输还是通过之前的非对称算法进行加密解密(性能开销大,但是更安全)。
这里说下一般浏览器中会预置一些权威CA(权威证书颁发机构)的证书,这样浏览器可以直接进行访问。如果是自己制作的证书那么会跳下面这个界面,需要信任后才能访问。
image.png
下面总结下基于KOA实现HTTPS访问
const Koa = require('koa')
const logger = require('koa-logger');
const sslify = require('koa-sslify').default;//http强制HTTPS
const https = require('https');//node内置https server
const fs = require('fs');
const path = require('path');
const serve = require('koa-static');//koa 静态资源插件
const home = serve(path.resolve(__dirname, './dist'));
const app = new Koa();
app.use(logger())
app.use(sslify())
app.use(home)
var options = {
key: fs.readFileSync('./private_key.pem'), //私钥文件路径
cert: fs.readFileSync('./ca-cert.pem') //证书文件路径
};
https.createServer(options, app.callback()).listen(9527, () => {
console.log(`server running success at 9527`)
});
上面代码中的私钥文件路径和证书文件路径是通过git
中预置的openssl
生成的,具体的方式看下面代码:
生成私钥的命令
openssl genrsa -out private_key.pem 1024
/*
参数解释:genrsa -- 用RSA算法,
private_key.pem导出的私钥名称
*/
image.png
生成请求证书的命令
openssl req -new -out ca-req.csr -key private_key.pem
/*
参数解释:ca-req.csr -- 证书请求名称,
private_key.pem前面生成的传输私钥的名称
*/
image.png
创建证书的命令
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey private_key.pem -days 3650
image.png
可以看到目录下已经生成对应的3个文件。
image.png
然后访问localhost:9527(之前已经在dist目录下预置了index.html)
test3.gif
【完】
参考文献
https://www.cnblogs.com/osbreak/p/9486188.html
https://blog.csdn.net/xiaoming100001/article/details/81109617
网友评论