对nodejs项目进行https化

代码上的替换很简单,把

app.listen(port, () => {
    console.log(`${pkg.name} listening on port ${port}`)
});

替换成

https.createServer({
    key: fs.readFileSync('./dist/static/pem/server.pem'),
    cert: fs.readFileSync('./dist/static/pem/server.crt'),
}, app).listen(port, () => {
    console.log(`${pkg.name} listening on port ${port}`)
});

其中

const https = require('https');
const app = express();

难点之一,自签https证书的制作,仅需3个步骤,根本不需要生成所谓的CA证书再给服务器证书签名

openssl genrsa 1024 > server.pem  
openssl req -new -key server.pem -out csr.pem  
openssl x509 -req -days 3650 -in csr.pem -signkey server.pem -out server.crt

分别生成了server.pem,csr.pem ,server.crt,其中server.pem和server.crt可实际使用

难点之二,自签证书的信任问题
一般使用https网址访问nodejs项目后,浏览器都会提示不安全,选择详细信息之后继续访问即可(表示暂时信任证书)

难点之三,前后端统一IP问题
nodejs同时负责前后端时,如果前端是localhost:8080,那么不要把后端的访问URL定义为127.0.0.1:8080,因为在浏览器看来这两者不一样,你在访问前端界面时,浏览器弹出的提示被你继续之后,信任的只是localhost:8080,之后访问127.0.0.1:8080的接口就会报失败,因为后台接口浏览器并不会征求用户的意见,一旦判断不信任证书,直接报错返回

另外,websocket如果想从ws升级为wss,也可以使用相同的方法生成自签证书,如果要与nodejs前端交互,为了信任该证书,可以在浏览器中尝试访问websocket地址(wss替换为https),信任之后,在不关闭浏览器标签页的情况下,访问nodejs前端URL,即可与nodejs前端交互

总之,最好当然是用正规证书,如果是是用自签证书,以上的坑还请注意,测试系统 WIN10 x64 Edge