node学习—深入剖析https(协议)模块(看这一篇就够了!)

一、了解https协议

这里有三个小伙伴,代表三个身份。
在这里插入图片描述

接着 海绵 向 珊迪 发送一个消息(即开始通信,这里忽略一些准备等过程)
在这里插入图片描述
但是这种明文的消息,一旦被 章鱼 截获并修改,将造成不可估量的损失
在这里插入图片描述
于是产生对信息加密的技术

1.对称加密

对称加密:产生一个密钥,可以用其加密,也可以用其解密
在这里插入图片描述
在这里插入图片描述
但是这种方式总得 先把密匙传给对方,这样后面通信时才能用密匙 加密解读。

在这里插入图片描述
如果在第一次传密匙时就被 章鱼把密匙截获了怎么办呢?
在这里插入图片描述

2.非对称加密

非对称加密:产生一对密钥,一个用于加密,一个用于解密
在这里插入图片描述
海绵 通过公钥加密信息传给 珊迪,珊迪使用 私钥解密,再利用 公钥加密信息 回信海绵

这时问题来了,海绵 没有私钥是没办法 解密 珊迪的回信的 !!
在这里插入图片描述
于是就有了对称加密和非对称加密联合一起使用。

在这里插入图片描述
这样就没问题了 ?肯定有问题 !!

看看章鱼哥是怎么操作的
在这里插入图片描述
最后章鱼哥还是拿到了 key2
在这里插入图片描述
单纯的海绵是玩不过章鱼哥的
在这里插入图片描述
蟹老板这时发现了商机 !!
在这里插入图片描述

3.证书颁发机构

在这里插入图片描述
在这里插入图片描述

第1步:浏览器获取证书

在这里插入图片描述
** 将公钥key1,CA公钥,域名通过公开的证书签名的算法运算后与证书签名对比**
在这里插入图片描述
此时的章鱼哥一旦拦截了 珊迪的信息并串改的话,海绵使用公开的 CA证书签名的算法,验证无法通过!
在这里插入图片描述
接下来就可以像前面一样进行通信了
在这里插入图片描述
由于只有私钥key1能解密消息,此时的 章鱼哥就表示无奈了,洗洗睡吧。
在这里插入图片描述

最后

在这里插入图片描述

二、https模块

1.服务器结构

在这里插入图片描述
通过nginx反向代理,且因为在服务器内部完成交互,所以一般不会被获取。
在这里插入图片描述

2.证书准备

  1. 网上购买权威机构证书
    在这里插入图片描述
  2. 本地产生证书:自己作为权威机构发布证书
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将上次的静态资源服务器,部署环境
//静态资源服务器
// http://localhost:9527/index.html  -> public/index.html 文件内容
// http://localhost:9527/css/index.css  -> public/css/index.css 文件内容
const https = require("https");
const URL = require("url");
const path = require("path");
const fs = require("fs");

async function getStat(filename) {
  try {
    return await fs.promises.stat(filename);
  } catch {
    return null;
  }
}

/**
 * 得到要处理的文件内容
 */
async function getFileContent(url) {
  const urlObj = URL.parse(url);
  let filename; //要处理的文件路径
  filename = path.resolve(__dirname, "public", urlObj.pathname.substr(1));
  let stat = await getStat(filename);
  if (!stat) {
    //文件不存在
    return null;
  } else if (stat.isDirectory()) {
    //文件是一个目录
    filename = path.resolve(
      __dirname,
      "public",
      urlObj.pathname.substr(1),
      "index.html"
    );
    stat = await getStat(filename);
    if (!stat) {
      return null;
    } else {
      return await fs.promises.readFile(filename);
    }
  } else {
    return await fs.promises.readFile(filename);
  }
}

async function handler(req, res) {
  const info = await getFileContent(req.url);
  if (info) {
    res.write(info);
  } else {
    res.statusCode = 404;
    res.write("Resource is not exist");
  }
  res.end();
}
//私钥公钥
const server = https.createServer(
  {
    key: fs.readFileSync(path.resolve(__dirname, "./server-key.pem")), //私钥
    cert: fs.readFileSync(path.resolve(__dirname, "./server-cert.crt"))
  },
  handler
);
server.on("listening", () => {
  console.log("server listen 443");
});
server.listen(443);

转载请写明出处!!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞羽逐星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值