[Node] http/2

avatarplhDigital nomad

前言

electron通过钩子函数,原本是直接加载index.html静态资源,但是在开发模式下,非常不便,每次都要重启electron.

设想的解决方案

fs的nodejs模块,实际上是基于ftp协议加载文件, 如果是通过http协议加载, 那么连接便是https://localhost:443,而我通过nodejs开一个小型服务器.并且,这样就能通过http网络协议连接electron端与react+webpack端沟通了.既然如此,何不利用nodejs - http2协议的服务端主动push功能,来热更新index.html静态资源呢,这非常强大呢.

http2模块

http2底层实现原理是非常复杂的,了解即可,如果要自己实现,麻烦不说,性能不见得会好.

http2 - nodejs API

const http2 = require('http2');
const fs = require('fs');
const port = 443;
const srv = http2.createSecureServer({
  key: fs.readFileSync('./localhost-privkey.pem'),
  cert: fs.readFileSync('./localhost-cert.pem')
});
srv.on('stream', (stream, headers) => {
  // stream is a Duplex
  stream.respond({
    'content-type': 'text/html',
    ':status': 200
  });
  stream.end('<h1>Hello dghjWorld</h1>');
});
srv.listen(port,p => {
  console.log(`success load ${port}`);
});

运行

通过nodemon server.js即可运行这个文件 image

Curl 运行,去拿资源...

image

生成证书的命令

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout localhost-privkey.pem -out localhost-cert.pem

关于https 中的加密协议

协议自然是SHA256了, 为啥是SHA256呢,因为我在利用 openssl生成证书的时候,写了要用sha256加密.

image

SSL 证书中包含的具体内容有:

(1)证书的发布机构CA

(2)证书的有效期

(3)公钥

(4)证书所有者

(5)签名

加密算法:

  • 对称加密 有流式、分组两种,加密和解密都是使用的同一个密钥。 例如:DES、AES-GCM、ChaCha20-Poly1305等

  • 非对称加密 加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。 例如:RSA、DSA、ECDSA、 DH、ECDHE

  • 哈希算法 将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。 例如:MD5、SHA-1、SHA-2、SHA-256 等

  • 数字签名 签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

浏览器告诉我证书并不属于专业机构颁发

image

听说chrome71版本才支持服务端push,但我打开经典版本的chrme才70版本,决定用chrome canary 这个版本,打开72版本,科技感十足..

image

Reference

HTTPS系列干货(一):HTTPS 原理详解 - 很好很强