如何在 Node.js 中创建 HTTPS 服务器
How to create an HTTPS server in Node.js?
给定SSL密钥和证书,如何创建HTTPS服务?
Express 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);
对于节点 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`)
};
在谷歌搜索"node https"时发现了这个问题,但接受的答案中的示例非常旧 - 取自当前 (v0.10) 版本的 node 的文档,它应该看起来像这样:
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);
上面的答案很好,但是对于Express和node,这将正常工作。
由于快速为您创建了应用程序,因此我将在此处跳过它。
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});
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);
更新
使用Let's Encrypt via Greenlock.js
原始帖子
我注意到这些答案都没有显示将中间根 CA 添加到链中,这里有一些零配置示例可以看到:
- https://github.com/solderjs/nodejs-ssl-example
- http://coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/
- https://github.com/solderjs/nodejs-self-signed-certificate-example
片段:
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);
});
如果您不尝试直接通过连接或快递来执行此操作,而是让本机https
模块处理它,然后使用它来为您提供连接/快递应用程序,这是通常更容易的事情之一。
此外,如果您在创建服务器时使用server.on('request', app)
而不是传递应用程序,则有机会将server
实例传递给创建连接/快速应用程序的某个初始值设定项函数(例如,如果您想在同一台服务器上通过 SSL 执行 websockets)。
若要使应用能够分别侦听端口 80
和 443
上的http
和https
,请执行以下操作
创建快速应用程序:
var express = require('express');
var app = express();
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);
有关完整详细信息,请参阅文档
与 Fastify 框架一起存档:
const { readFileSync } = require('fs')
const Fastify = require('fastify')
const fastify = Fastify({
https: {
key: readFileSync('./test/asset/server.key'),
cert: readFileSync('./test/asset/server.cert')
},
logger: { level: 'debug' }
})
fastify.listen(8080)
(如果需要编写测试,请运行openssl req -nodes -new -x509 -keyout server.key -out server.cert
来创建文件)
如果您只需要在本地进行本地开发,我已经专门为此任务创建了实用程序 - https://github.com/pie6k/easy-https
import { createHttpsDevServer } from 'easy-https';
async function start() {
const server = await createHttpsDevServer(
async (req, res) => {
res.statusCode = 200;
res.write('ok');
res.end();
},
{
domain: 'my-app.dev',
port: 3000,
subdomains: ['test'], // will add support for test.my-app.dev
openBrowser: true,
},
);
}
start();
它:
- 将自动将正确的域条目添加到/etc/hosts
- 仅在首次运行/域更改时需要时才要求您输入管理员密码
- 将为给定域准备https证书
- 将信任本地计算机上的这些证书
- 将在开始时打开指向本地服务器https url的浏览器
- 从这里下载用于openssl设置的rar文件:https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
- 只需将您的文件夹复制到 c 驱动器中即可。
- 创建openssl.cnf文件并从以下位置下载其内容:http://web.mit.edu/crypto/openssl.cnfopensssl.cnf 可以放在任何地方,但当我们在命令提示符下给出时,路径应该是正确的。
- 打开命令 propmt 并设置 openssl.cnf 路径 C:''set OPENSSL_CONF=d:/openssl.cnf5.在cmd中运行以下命令:C:''openssl-0.9.8r-i386-win32-rev2>openssl.exe
- 然后运行OpenSSL> genrsa -des3 -out server.enc.key 1024
- 然后它会要求密码短语:输入 4 到 11 个字符作为您的证书密码
- 然后运行这个 Openssl>req -new -key server.enc.key -out server.csr
- 然后它会询问一些详细信息,如国家代码州名称等,自由填写。10 . 然后运行 Openssl> rsa -in server.enc.key -out server.key
- 运行此 OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 然后使用堆栈溢出的先前代码谢谢
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 为effect Composer创建GodRays效果过程
- 从javascript创建一个列表
- onkeyup无法动态创建多个文本区域
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何访问声音管理器2创建的声音对象
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 使用Facebook live API创建实时视频对象时的隐私设置
- 在动态创建的元素上获取对特定选择器的引用
- 如何创建带有插槽的vue js组件预加载程序
- 如何在创建键时引用来自同一对象的键
- 如何创建JSON数组
- 从html创建一个指令,该指令按类名应用函数
- 使用Javascript创建测验页面
- 更改使用Chart.js创建的图表中的轴线颜色
- 组合Bookmarklets以在HTTP和HTTPS之间创建切换
- 在nodejs中创建HTTPS api并对其进行测试
- NodeJS从现有tl创建https.服务器
- 如何在 Node.js 中创建 HTTPS 服务器