Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中创建HTTPS服务器?_Javascript_Node.js_Ssl_Https_Webserver - Fatal编程技术网

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

Javascript 如何在Node.js中创建HTTPS服务器?,javascript,node.js,ssl,https,webserver,Javascript,Node.js,Ssl,Https,Webserver,给定SSL密钥和证书,如何创建HTTPS服务?我发现了以下示例 这适用于节点v0.1.94-v0.3.1服务器。在较新版本的节点中删除setSecure() 直接从该来源: const crypto = require('crypto'), fs = require("fs"), http = require("http"); var privateKey = fs.readFileSync('privatekey.pem').toString(); var certificate

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

我发现了以下示例

这适用于节点v0.1.94-v0.3.1<代码>服务器。在较新版本的节点中删除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);

以上答案很好,但使用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});
这句话说得很清楚

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

我添加了一些评论和来自以下网站的片段:


在谷歌搜索“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);
更新 使用Let's Encrypt via

原职 我注意到这些答案中没有一个表明向链中添加中间根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);
});
如果您不尝试直接通过connect或express进行连接,但让本机的
https
模块处理它,然后使用它为您的connect/express应用程序提供服务,那么这通常会更容易


另外,如果您使用
server.on('request',app)
而不是在创建服务器时传递应用程序,则您可以将
server
实例传递给创建connect/express应用程序的某个初始化函数(例如,如果您希望在同一服务器上通过ssl执行WebSocket).

要使您的应用程序分别在端口
80
443
上侦听
http
https
,请执行以下操作

创建express应用程序:

var express = require('express');
var app = express();
express()
返回的应用程序是一个JavaScript函数。它可以作为回调传递到节点的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);

有关完整的详细信息,请参见

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);
  • 从此处下载openssl设置的rar文件:
  • 只需在c驱动器中复制文件夹
  • 创建openssl.cnf文件并从以下位置下载其内容: openssl.cnf可以放在任何地方,但当我们在命令提示符下给出时,路径应该是正确的
  • 打开命令propmt并设置openssl.cnf路径C:\set openssl_CONF=d:/openssl.cnf 5.在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,然后使用堆栈溢出上的先前代码 谢谢

  • 您还可以将其与Fastify框架一起使用:

    const{readFileSync}=require('fs'))
    const fastfy=require('fastfy')
    常数fastfy=fastfy({
    https:{
    key:readFileSync('./test/asset/server.key'),
    证书:readFileSync('./test/asset/server.cert')
    },
    记录器:{level:'debug'}
    })
    快听(8080)
    

    (并运行
    openssl req-nodes-new-x509-keyout server.key-out server.cert来创建文件,如果您需要编写测试)

    如果您只需要在本地进行开发,我已经为这个任务创建了实用程序-

    它:

    • 将自动向/etc/hosts添加适当的域条目
    • 只有在第一次运行/域更改时需要时,才会要求您输入管理员密码
    • 将为给定域准备https证书
    • 将信任本地计算机上的这些证书
    • 将在开始指向本地服务器https url时打开浏览器

    setSecure
    已弃用。查看此示例,而不是查看下面由@Jacob Marble提供的官方快速答案。此示例不再有效,因为HTTPS实现是在Node.JS 0.4中重新完成的。参见nodejs.org上的相应文档。这个答案非常古老,不再适用。请看下面pkyeck的答案,或者转到:链接也是brokenNice,我自己正要发布这个。非常感谢。此外,我发现生成自签名证书很有帮助。请确保在
    https.createServer
    中首先放置
    选项
    ,以避免出现神秘错误。我正在设置一个几乎相同的https服务器端口8888,但不确定如何更改路由。当我运行curl-unsecurecurl时:(35)连接到localhost时出现未知SSL协议错误:8888错误来自何处以及如何避免。在浏览器中键入localhost:8888时,它挂起,https:/localhost:8888提供SSLerror@Costa您可以使用或手写中间件将用户从http重定向到https-it@Nathanmakaskle您可以禁用密码:检查此项,但如果您使用macOS,请确保生成的密钥长度至少为2048:
    openssl genrsa-out key.pem 2048
    这似乎是已弃用,因为“应用程序不再从http.Server继承”为什么要设置
    module.exports
    ?没有必要这样做that@matejkramny,可能是因为它使测试变得容易。我用它代替了express.js,但想法是一样的。下面是我如何设置一个node.js服务器,该服务器不使用express,并且使用最新版本的node,同时接受HTTP和HTTPS-看这里:这个问题发生了什么?这个
    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);
    
    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();