如何在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示例 ,可以看到:
- https://github.com/coolaj86/nodejs-ssl-example
- http://blog.coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/
- https://github.com/coolaj86/nodejs-self-signed-certificate-example
- https://github.com/Daplie/localhost.daplie.com-certificates
- https://github.com/Daplie/localhost.daplie.com-server
片段:
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);
要使您的应用程序分别在端口80
和443
上侦听http
和https
,请执行以下操作
创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);
有关详细信息,请参阅文档
- 从这里下载openssl的rar文件: https : //indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
- 只需复制您的文件夹在C盘。
- 创buildopenssl.cnf文件并从http://web.mit.edu/crypto/openssl.cnf下载它们的内容openssl.cnf可以放在任何地方,但是当命令提示符给出时,path应该是正确的。;
- 打开命令propmt并设置openssl.cnfpathC:\ 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
- 然后它会要求通过短语:input4到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然后使用以前的代码堆栈溢出谢谢