如何在Node.js中创build一个HTTPS服务器?

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

我find下面的例子。 这是几个月大,但它可能是好的:

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

直接从这个来源:

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 API doc很清楚地说明了这一点。

另外, 这个答案给出了创build一个自签名证书的步骤。

我已经添加了一些评论和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); 

发现这个问题,同时谷歌search“节点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); 

上面的答案是好的,但与Express和节点这将工作正常。

由于快递为您创build应用程序,我会跳过这里。

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

我注意到这些答案都没有显示在链中添加中间根CA ,下面是一些零configuration示例 ,可以看到:

片段:

 var options = { key: fs.readFileSync(path.join('certs', 'my-server.key.pem')) , ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))] , cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem')) , requestCert: false , rejectUnauthorized: 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); }); 

如果你直接通过连接或expression来直接这些事情,那么这些事情通常会更容易,但让原生的https模块处理它,然后使用它来为连接/快速应用程序提供服务。

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

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

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

创build快速应用程序:

 var express = require('express'); var app = express(); 

express()返回的应用程序是一个JavaScript函数。 它可以作为callback传递给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); 

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

  1. 从这里下载openssl的rar文件: https : //indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. 只需复制您的文件夹在C盘。
  3. 创buildopenssl.cnf文件并从http://web.mit.edu/crypto/openssl.cnf下载它们的内容openssl.cnf可以放在任何地方,但是当命令提示符给出时,path应该是正确的。
  4. 打开命令propmt并设置openssl.cnfpathC:\ set OPENSSL_CONF = d:/openssl.cnf 5.运行cmd:C:\ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. 然后运行OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. 然后它会要求通过短语:input4到11个字符作为您的证书密码
  7. 然后运行这个OpenSSL> req -new -key server.enc.key -out server.csr
  8. 然后它会要求一些细节,如国家代码国家名称等自由填写。 10。 然后运行OpenSSL> rsa -in server.enc.key -out server.key
  9. 运行这个OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt然后使用以前的代码堆栈溢出谢谢