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

IT技术 javascript node.js ssl https webserver
2021-02-02 02:43:34

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

6个回答

快递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);
@Costa 您可以使用express-force-ssl或手写中间件将用户从 http 重定向到 https - 这非常简单
2021-03-12 02:43:34
我正在设置一个几乎相同的 https 服务器端口 8888,但不确定如何更改路由。当我运行 curl curl --insecure localhost:8888 curl: (35) Unknown SSL protocol error in connection to localhost:8888 错误来自什么以及如何解决它。当我在浏览器中输入 localhost:8888 时,它挂起并且 https://localhost:8888 给出 SSL 错误
2021-03-16 02:43:34
确保您options首先输入https.createServer,以避免出现神秘错误。
2021-04-01 02:43:34
@NathanMcKaskle 您可以禁用密码:检查本指南,但如果您使用的是 macOS,请确保生成的密钥长度至少为 2048:openssl genrsa -out key.pem 2048
2021-04-07 02:43:34
太好了,正想自己发这个。谢谢你。此外,我发现这篇文章有助于生成自签名证书。
2021-04-10 02:43:34

对于 Node 0.3.4 及以上一直到当前 LTS(在此编辑时为 v16),https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener包含您需要的所有示例代码:

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

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

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end(`hello world\n`);
}).listen(8000);

请注意,如果要使用certbot工具使用 Let's Encrypt 的证书,则调用私钥并调用privkey.pem证书fullchain.pem

const certDir = `/etc/letsencrypt/live`;
const domain = `YourDomainName`;
const options = {
  key: fs.readFileSync(`${certDir}/${domain}/privkey.pem`),
  cert: fs.readFileSync(`${certDir}/${domain}/fullchain.pem`)
};
2021-03-13 02:43:34
链接也坏了
2021-03-14 02:43:34
此示例不再起作用,因为 HTTPS 实现在 Node.JS 0.4 中重新完成。请参阅 nodejs.org 上的相应文档。stackoverflow.com/questions/5136353/...
2021-03-16 02:43:34
这个答案很旧,不再有效。请参阅下面 pkyeck 的回答,或前往:nodejs.org/api/https.html
2021-03-20 02:43:34
请参阅下面@Jacob Marble 的官方明确答复。
2021-04-05 02:43:34

在谷歌搜索“node 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);
是否可以使用文件夹创建 https 服务器?因此,您可以将文件放入其中并访问该文件,例如localhost:81/main.js
2021-03-12 02:43:34
这看起来不错,但是我如何在那里生成您需要的文件 ( *.pem)?我尝试关注此页面,但是localhost:8000在浏览器中打开时,没有收到任何数据(只是加载...)。
2021-03-18 02:43:34
像魅力一样工作。当我在最近被迫通过 https 运行的 PHP 应用程序之上运行 node.js 工具 (PDFJS) 时,此信息非常有用。iframe 非常不乐意在备用的非 https 端口上加载我的 node.js 应用程序。
2021-03-20 02:43:34
@IonicăBizău,用于生成密钥,安装openssl,然后在 cmd 提示符下,键入openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
2021-03-20 02:43:34
@IonicăBizău 您需要直接转到https://localhost:8080. HTTP 不是 HTTPS。
2021-03-30 02:43:34

上面的答案很好,但是使用 Express 和 node 这将正常工作。

由于 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});
@matejkramny,可能是因为它易于测试。
2021-03-20 02:43:34
你为什么设置module.exports没有这个必要
2021-03-28 02:43:34
这似乎已被弃用,因为“应用程序不再从 http.Server 继承”
2021-04-05 02:43:34

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);

如果您还想支持 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);
你在说什么?你的意思createServer是不存在了?它仍然记录在nodejs.org/api/http.htmlnodejs.org/api/https.html的 Node.js v16.5.0 文档中并且没有标记为已弃用。你真的试过运行这段代码吗?如果是这样,您遇到了哪些错误?
2021-03-29 02:43:34
实际上我发现了我的错误。有一行需要更改var https = require('https').Server(app);var https = require('https');现在,一切正常...谢谢。
2021-03-30 02:43:34
所有这些答案都是旧的和过时的。我希望 StackOverflow 能够清理非常古老的问题和答案。createServer已弃用!此功能不再存在。
2021-04-02 02:43:34