koa

基于KOA实现https访问

2019-04-21  本文已影响0人  李牧敲代码

【知识背景】

现在的网站但凡涉及到一些安全信息的都会走https协议(http + TLS)。这里的TLS(Transport Layer Security)指的是应用于传输层(TCP这层)的安全协议。
https安全的原因在于他在传输的过程中对数据进行了加密,用抓包工具抓到的数据包的内容是加密过的(如果是HTTP的话的都是明文)。试想下,如果不用https,直接用wireshark这类抓包工具监听网卡上的信息,所有的信息包括用户名和密码都被抓去了,那登录验证的机制岂不是形同虚设?这就是https存在的意义。

对称算法和非对称算法

定义:能通过一个秘钥,双向加密和解密的算法称为对称算法(RC2,Base64);需要通过一对秘钥(公钥加密,私钥解密)加密和解密的算法称为非对称算法(MD5,HASH,RSA)。

这里讲下HTTPS的大致流程。

  1. 客户端先下载服务端的数字证书(包含加密公钥)。
  2. 客户端随机生成一个值(内容秘钥),通过数字证书中预置的公钥(传输公钥)进行加密后传输给服务端。
  3. 服务端接受到信息后,用(传输私钥)进行解密获得内容私钥。之后双方基于这个内容私钥通过对称算法进行内容的加密和解密(用对称算法的原因是因为开销小),传输还是通过之前的非对称算法进行加密解密(性能开销大,但是更安全)。

这里说下一般浏览器中会预置一些权威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

上一篇 下一篇

猜你喜欢

热点阅读