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


128

在以前的Express版本中,我可以这样做:

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

但是,在较新版本的express中,此功能不再起作用:

var app = express();

我应该打电话app.use()来设置证书吗?如果可以,怎么办?

Answers:


151

请参阅Express文档以及https.createServerNode文档(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


来自节点的hmm:https.createServer(options,[requestListener]),所以可以通过应用程序吗?那不是那个应用程序是一个“对象”吗?
murvinlai 2012年

1
“ app”的功能签名是什么?我尝试在github上查找快递,但我看不到需要(要求,要求)
murvinlai 2012年

1
看一下createServerin 的定义connect.js(express只是从connect继承过来的)。您会看到它返回了带有正确签名的函数。connect()只是一个别名connect.createServer(),因此也是如此express()(它可能会做一些额外的初始化,但结果仍然是适合用作请求处理程序的函数)。
ebohlman

11
@Qix-在OP的示例中app已定义。这个答案是令人满意的。
Seiyria

4
有什么大纲如何获取.pem文件?我的证书提供者有两个.crt文件。
SCBuergel.eth

103

我能够使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");
});

1
您实际上如何在浏览器上看到世界?127.0.0.1:8000给我一个错误107(net :: ERR_SSL_PROTOCOL_ERROR):SSL协议错误。
aCuria 2012年

投票还为时过早。我得到-错误:addListener仅接受Function的实例
Meekohi 2013年

请记住,这是很久以前写的。这可能不再适用于Express或Node.js的较新版本
geoffreak 2013年

8
这已经太晚了,但是SSL_PROTOCOL_ERROR可能是由于您使用http:// <ssl_enabled_endpoint>引起的。它应该是https:// <ssl_enabled_endpoint>
andreimarinescu

9

这是我的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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.