如何在Node.js中创建HTTPS服务器?

mur*_*lai 342 javascript ssl https webserver node.js

给定SSL密钥和证书,如何创建HTTPS服务?

Jac*_*ble 469

快递API文档相当明确阐述了这一点.

此外,此答案提供了创建自签名证书的步骤.

我在Node.js HTTPS文档中添加了一些注释和一个片段:

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
Run Code Online (Sandbox Code Playgroud)

  • 很好,正准备发布这个.谢谢.此外,我发现[本文](http://docs.nodejitsu.com/articles/HTTP/servers/how-to-create-a-HTTPS-server)有助于生成自签名证书. (48认同)
  • 确保将“options”放在“https.createServer”中,以避免出现神秘错误。 (2认同)
  • @Costa您可以使用[express-force-ssl](https://github.com/battlejj/express-force-ssl)或手写中间件将用户从http重定向到https - 它[非常简单](http:// jaketrent.com/post/https-redirect-node-heroku/) (2认同)

hvg*_*des 147

我发现了以下例子.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

这适用于节点v0.1.94 - v0.3.1.server.setSecure()在较新版本的节点中删除.

直接来自该来源:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

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

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

var handler = function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
Run Code Online (Sandbox Code Playgroud)

  • 此示例不再起作用,因为在Node.JS 0.4中重新完成了HTTPS实现.请参阅nodejs.org上的相应文档.http://stackoverflow.com/questions/5136353/node-js-https-secure-error?lq=1 (20认同)
  • 这个答案非常陈旧,不再适用.请通过下面的pkyeck查看答案,或访问:http://nodejs.org/api/https.html (10认同)
  • 请参阅@Jacob Marble下面的官方明确答复. (6认同)
  • 链接应该是评论. (4认同)
  • `setSecure` 已弃用。请检查这个 http://stackoverflow.com/questions/5136353/node-js-https-secure-error (3认同)
  • 链接也被打破了 (2认同)

pky*_*eck 85

在谷歌搜索"节点https"时发现这个问题,但接受的答案中的例子非常陈旧 - 取自当前(v0.10)版本的节点的文档,它应该如下所示:

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)

  • @IonicăBizău,用于生成密钥,安装`openssl`,然后在cmd提示符下键入`openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001` (7认同)
  • 这看起来不错,但是如何在此处生成您需要的文件(`* .pem`)?我尝试过[跟随此页面](https://freenode.net/certfp/makecert.shtml),但是在浏览器中打开“ localhost:8000”时,未收到任何数据(正在加载...)。 (2认同)
  • @IonicăBizău您需要直接转到`https:// localhost:8080`.HTTP不是HTTPS. (2认同)

小智 48

上面的答案是好的,但使用Express和节点,这将很好.

由于express为您创建应用程序,我将在此处跳过.

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
Run Code Online (Sandbox Code Playgroud)

  • 这似乎已被弃用,因为"应用程序不再继承自http.Server" (12认同)
  • 为什么要设置`module.exports`?没有这个必要 (2认同)

Joh*_*ers 19

Node.js中HTTPS服务器的最小设置如下:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
Run Code Online (Sandbox Code Playgroud)

如果您还想支持http请求,则需要进行以下小修改:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
Run Code Online (Sandbox Code Playgroud)

  • 所有这些答案都是旧的和过时的。我希望 StackOverflow 能够清理非常非常旧的问题和答案。`createServer` 已弃用!该功能不再存在。 (2认同)

Coo*_*J86 18

更新

通过Greenlock.js使用Let的加密

原帖

我注意到这些答案都没有显示向链中添加中间根CA,这里有一些零配置示例可以看到:

片段:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});
Run Code Online (Sandbox Code Playgroud)

如果您尝试通过connect或express直接执行此操作,这通常会更容易,但让本机https模块处理它然后使用它来为您提供连接/表达应用程序.

此外,如果您server.on('request', app)在创建服务器时使用而不是传递应用程序,它会让您有机会将server实例传递给创建connect/express应用程序的某个初始化函数(如果您想在同一服务器上通过ssl 执行websockets,例).


cmd*_*cmd 8

为了使您的应用程序监听双方httphttps有关港口80443分别执行以下操作

创建快速应用:

var express = require('express');
var app = express();
Run Code Online (Sandbox Code Playgroud)

返回的应用程序express()是一个JavaScript函数.它可以作为回调来传递给Node的HTTP服务器来处理请求.这样可以使用相同的代码库轻松提供应用程序的HTTP和HTTPS版本.

你可以这样做:

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
Run Code Online (Sandbox Code Playgroud)

有关完整详细信息,请参阅文档