如何为express.js 服务器设置 SSL 证书?

问题描述 投票:0回答:4

之前,在旧版本的express中,我可以这样做:

express.createServer({key:'keyFile', cert:'certFile'});

但是,在较新版本的 Express 中,这不再起作用:

var app = express();

我应该致电

app.use()
来设置证书吗?如果是的话怎么办?

node.js express ssl-certificate
4个回答
208
投票

请参阅 Express 文档 以及 https.createServer 的 Node 文档(这是 Express 建议使用的):

var privateKey = fs.readFileSync( 'privatekey.pem' );
var certificate = fs.readFileSync( 'certificate.pem' );

https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(port);

createServer 的其他选项位于:http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener


130
投票

我能够使用以下样板代码让 SSL 工作:

var fs = require('fs'),
    http = require('http'),
    https = require('https'),
    express = require('express');

var port = 8000;

var options = {
    key: fs.readFileSync('./ssl/privatekey.pem'),
    cert: fs.readFileSync('./ssl/certificate.pem'),
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

app.get('/', function (req, res) {
    res.writeHead(200);
    res.end("hello world\n");
});

13
投票

这是我的工作代码用于express 4.0

express 4.0 与 3.0 等有很大不同。

4.0 您有 /bin/www 文件,您将在此处添加 https。

“npm start”是启动 Express 4.0 服务器的标准方式。

readFileSync() 函数应该使用 __dirname 获取当前目录

当 require() 使用 ./ 引用当前目录。

首先将 private.key 和 public.cert 文件放在 /bin 文件夹下, 它与 WWW 文件是同一文件夹

找不到这样的目录错误:

  key: fs.readFileSync('../private.key'),

  cert: fs.readFileSync('../public.cert')

错误,没有找到这样的目录

  key: fs.readFileSync('./private.key'),

  cert: fs.readFileSync('./public.cert')

工作代码应该是

key: fs.readFileSync(__dirname + '/private.key', 'utf8'),

cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')

完整的https代码是:

const https = require('https');
const fs = require('fs');

// readFileSync function must use __dirname get current directory
// require use ./ refer to current directory.

const options = {
   key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
  cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
};


 // Create HTTPs server.

 var server = https.createServer(options, app);

4
投票

2024 年,现在获取 LetsEncrypt 证书变得非常简单:

  1. 停止您的网络服务器一分钟。

  2. 使用命令:

certbot certonly --standalone

然后它会询问您的电子邮件和域名。一旦你输入这些,它就会吐出文件位置。

const cts = {
    cert: fs.readFileSync("/etc/letsencrypt/-blah-/fullchain.pem"),
    key: fs.readFileSync("/etc/letsencrypt/-blah-/privkey.pem")
}

启动 https 服务器:

app = express()
/*
    app.use(...)
    app.get(...)

    .. etc etc
*/
https.createServer(cts, app).listen(443)

SSL websocket 服务器的重要提示:

所有重要的站点都会在不同端口上有一些套接字服务器以及 Web 服务器。

秘密是您只需添加(即一行代码)一个 https 服务器专门为每个 wss 服务器。 (完整示例。)

// create https server SPECIFICALLY FOR wss 7788
let for_7788 = https.createServer(options).listen(7788)
let wss = new WSServer({ server: for_7788 })
wss.on(/* ... */)
© www.soinside.com 2019 - 2024. All rights reserved.