一、了解https协议
这里有三个小伙伴,代表三个身份。
接着 海绵 向 珊迪 发送一个消息(即开始通信,这里忽略一些准备等过程)
但是这种明文的消息,一旦被 章鱼 截获并修改,将造成不可估量的损失
于是产生对信息加密的技术
1.对称加密
对称加密:产生一个密钥,可以用其加密,也可以用其解密
但是这种方式总得 先把密匙传给对方,这样后面通信时才能用密匙 加密解读。
如果在第一次传密匙时就被 章鱼把密匙截获了怎么办呢?
2.非对称加密
非对称加密:产生一对密钥,一个用于加密,一个用于解密
海绵 通过公钥加密信息传给 珊迪,珊迪使用 私钥解密,再利用 公钥加密信息 回信海绵
这时问题来了,海绵 没有私钥是没办法 解密 珊迪的回信的 !!
于是就有了对称加密和非对称加密联合一起使用。
这样就没问题了 ?肯定有问题 !!
看看章鱼哥是怎么操作的
最后章鱼哥还是拿到了 key2
单纯的海绵是玩不过章鱼哥的
蟹老板这时发现了商机 !!
3.证书颁发机构
第1步:浏览器获取证书
** 将公钥key1,CA公钥,域名通过公开的证书签名的算法运算后与证书签名对比**
此时的章鱼哥一旦拦截了 珊迪的信息并串改的话,海绵使用公开的 CA证书签名的算法,验证无法通过!
接下来就可以像前面一样进行通信了
由于只有私钥key1能解密消息,此时的 章鱼哥就表示无奈了,洗洗睡吧。
最后
二、https模块
1.服务器结构
通过nginx反向代理,且因为在服务器内部完成交互,所以一般不会被获取。
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);
转载请写明出处!!!