使用Node.js和express实现https传输

迁移已有项目至HTTPS

Posted by Haiming on April 11, 2019

折腾了一阵,实现了将已有项目迁至HTTPS。下面是主要步骤。

1. 环境:

  • Win 10
  • Node.js : v8.9.4
  • Npm : 6.9.0

2. 准备工作

由于是将已有项目迁移至HTTPS, 因此本文不涉及初始化和创建项目,默认在已有项目的入口,本文是对 index.js 来进行操作。

2.1 安装express

npm install express

2.2 安装openssl

有的git版本自带openssl,但是我的没有,所以要先安装。安装步骤如下:

  1. 在链接 https://code.google.com/p/openssl-for-windows/downloads/detail?name=openssl-0.9.8k_WIN32.zip 之中下载openssl,我用的是最新版本。
  2. 解压并且添加bin目录到 Path 变量下。
  3. 创建环境变量 variable name = OPENSSL_CONF , variable value = openssl.cnf的位置

3. 生成密钥与使用密钥

3.1 生成密钥

下面步骤建议在cmd之中使用管理员模式,实测不使用管理员模式也会生成密钥,但是cmd会报错。

  1. openssl genrsa -out pk.pem 1024 : 此命令生成私钥 Private key pk.pem
  2. openssl req -new -key pk.pem -out certreq.csr : 此命令通过 Private Key 生成 CSR 证书签名 certreq.csr 。在这个步骤之中,要输入一些用于生成 CSR 的信息, 比如国家等等。
  3. openssl x509 -req -in certreq.csr -signkey pk.pem -out certificate.pem : 此命令通过私钥和 CSR 证书签名生成证书文件 certificate.pem

3.2 在 index.js 之中插入密钥

此处参考了https://www.cnblogs.com/handongyu/p/6260209.html的文章,表示感谢

var app = require('express')();
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey  = fs.readFileSync('/pk.pem', 'utf8');
var certificate = fs.readFileSync('/certificate.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};

var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
var PORT = 18080;
var SSLPORT = 18081;

httpServer.listen(PORT, function() {
    console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
httpsServer.listen(SSLPORT, function() {
    console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});

// Welcome
app.get('/', function(req, res) {
    if(req.protocol === 'https') {
        res.status(200).send('Welcome to Safety Land!');
    }
    else {
        res.status(200).send('Welcome!');
    }
});

服务器启动之后可以点击console的两个链接比较HTTP 和 HTTPS 的不同, 同时使用fiddler抓包提示已经HTTPS 加密,成功。