Node.js'de HTTPS sunucusu nasıl oluşturulur?


361

SSL anahtarı ve sertifikası verildiğinde, HTTPS hizmeti nasıl oluşturulur?


2
Kullandığım restify.js yerine express.js ki, ama fikri aynıdır. Hem HTTP hem de HTTPS'yi kabul eden bir node.js sunucusu nasıl kurarım qugstart.com/blog/node-js/…
awaage

2
ekspres olmadan ve düğümün en yeni sürümü ile - buraya bakın: stackoverflow.com/a/21809393/388026
pkyeck

1
Bu soruya ne oldu? Cevaplar aslında express.js ile ilgili olduğunu ima ediyor.
doug65536

geçerli, kendinden imzalı bir SSL sertifikası oluşturmak ve bir HTTPS sunucusu başlatmak sadece birkaç adımda
Lloyd

3
Biraz geç ama birisi tam bir nodejs https öğretici gerekiyorsa, burada bulabilirsiniz: programmerblog.net/nodejs-https-server
Jason W

Yanıtlar:


151

Aşağıdaki örneği buldum.

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

Bu, v0.1.94 - v0.3.1 düğümü için geçerlidir. server.setSecure()düğümü yeni sürümlerinde kaldırıldı.

Doğrudan bu kaynaktan:

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

3
setSecurekullanımdan kaldırıldı. Bunun yerine şunu kontrol edin stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle

7
@Jacob Marble'in resmi açık cevabına bakınız.
clayzermk1

21
HTTPS uygulaması Düğümde yeniden yapıldığı için bu örnek artık çalışmaz. JS 0.4. Nodejs.org adresindeki ilgili belgelere bakın. stackoverflow.com/questions/5136353/…
scottyab

11
Bu cevap çok eski ve artık işe yaramıyor. Lütfen aşağıdaki cevabın cevabına bakınız veya nodejs.org/api/https.html
Jay Sheth

2
Ayrıca bağlantı koptu
TlonXP

484

Ekspres API doc oldukça net bir şekilde bu büyü.

Ayrıca bu yanıt , kendinden imzalı bir sertifika oluşturma adımları verir.

Node.js HTTPS belgelerinden bazı yorumlar ve bir snippet ekledim :

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

49
Güzel, bunu kendim göndermek üzereydim. Teşekkür ederim. Ayrıca, bu makaleyi kendinden imzalı bir sertifika oluşturmak için yararlı buldum .
clayzermk1

1
Şifreleme hatalarından kaçınmak için optionsönce koyduğunuzdan emin olun https.createServer.
wberry

1
Neredeyse aynı https sunucusu bağlantı noktası 8888'i kuruyorum ve yolları nasıl değiştireceğimi bilmiyorum. curl curl --insecure localhost: 8888 curl: (35) çalıştırdığımda localhost: 8888 ile ilgili bilinmeyen SSL protokolü hatası ne geliyor ve nasıl giderilir . Tarayıcıya localhost: 8888 yazdığımda askıda kalıyor ve https: / localhost: 8888 SSL hatası veriyor
reza

2
@Costa, express-force-ssl veya elle yazılmış ara yazılım ile kullanıcıları http'den https'ye yönlendirebilirsiniz - oldukça basit
floatdrop

1
@NathanMcKaskle Şifreyi devre dışı bırakabilirsiniz: Bu kılavuzu kontrol edin, ancak macOS kullanıyorsanız, oluşturulan anahtar uzunluğunun en az 2048 olduğundan emin olun:openssl genrsa -out key.pem 2048
sakisk

87

"Düğüm https" yi googling ederken bu soruyu buldum , ancak kabul edilen yanıttaki örnek çok eski - düğümün geçerli (v0.10) sürümünün belgelerinden alındığında , şöyle görünmelidir:

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

Bir cazibe gibi çalıştı. Son zamanlarda https üzerinden çalıştırılmak zorunda kalan bir PHP uygulamasının üstünde bir node.js aracı (PDFJS) çalıştırdığımda bu bilgiler çok kullanışlı geldi. İframe, node.js uygulamamı alternatif, https olmayan bir bağlantı noktasına yüklemek için çok mutsuzdu.
lewsid

2
Bu iyi görünüyor, ancak orada istediğiniz dosyaları nasıl oluşturabilirim ( *.pem)? Bu sayfayı takiplocalhost:8000 etmeyi denedim , ancak tarayıcıda açarken veri alınmıyor (sadece yükleniyor ...).
Ionică Bizău

7
@ IonicăBizău, anahtarları oluşturmak için, yükleyin openssl, sonra cmd istemine, yazınopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido

2
@ IonicăBizău doğrudan gitmeniz gerekiyor https://localhost:8080. HTTP HTTPS DEĞİLDİR.
Florian Wendelborn

Klasörle https sunucusu oluşturmak mümkün müdür? Böylece içine dosya koyabilir ve localhost
FrenkyB

47

Yukarıdaki cevaplar iyidir, ancak Express ve düğüm ile bu iyi çalışır.

Ekspres sizin için uygulamayı oluşturduğundan, bunu burada atlayacağım.

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

Bu, teknik olarak daha doğru cevaptır, çünkü soru Express.js ile nasıl yapılacağıydı
Kato

12
"Uygulamalar artık http.Server'dan devralmadığı için" kullanımdan kaldırılmış gibi görünüyor
Merlyn Morgan-Graham

2
Neden ayarlıyorsun module.exports? Buna gerek yok
Matej

1
@matejkramny, muhtemelen test etmeyi kolaylaştırdığı için.
Justin

21

Node.js'de bir HTTPS sunucusu için asgari kurulum şöyle olacaktır:

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

Ayrıca http isteklerini desteklemek istiyorsanız, yalnızca bu küçük değişikliği yapmanız gerekir:

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

18

Güncelleme

Let's Encrypt'i Greenlock.js üzerinden kullanın

Orijinal Mesaj

Bu cevapların hiçbirinin zincire bir Ara Kök CA eklemenin , burada görmek için oynamak için bazı sıfır yapılandırma örnekleri olduğunu göstermediğini fark ettim :

Pasaj:

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

Bu, doğrudan bağlantı veya ekspres yoluyla yapmaya çalışmazsanız genellikle daha kolay olan şeylerden biridir , ancak yerel httpsmodülün işlemesine izin verin ve ardından bağlantı / ekspres uygulamanıza hizmet etmek için bunu kullanın.

Ayrıca, server.on('request', app)sunucuyu oluştururken uygulamayı iletmek yerine kullanırsanız , serverörneği connect / express uygulamasını oluşturan bazı başlatıcı işlevine geçirme fırsatı verir ( aynı sunucuda ssl üzerinden websockets yapmak istiyorsanız , çünkü misal).


Bu güzel bir açıklama ama güncelleme bölümünde sağlanan bağlantı koptu (500 hata veriyor)
Chucky

8

Her iki dinlemek için uygulamanızı etkinleştirmek için httpve httpsbağlantı noktalarında 80ve 443sırasıyla aşağıdakileri yapın

Hızlı bir uygulama oluşturun:

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

Tarafından döndürülen uygulama express()bir JavaScript işlevidir. Düğümlerin HTTP sunucularına istekleri işlemek için geri arama olarak aktarılabilir. Bu, aynı kod tabanını kullanarak uygulamanızın hem HTTP hem de HTTPS sürümlerini sağlamayı kolaylaştırır.

Bunu aşağıdaki gibi yapabilirsiniz:

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

Ayrıntılı bilgi için dokümana bakın


0

Bunu Fastify çerçevesiyle de arşivleyebilirsiniz:

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)

(ve openssl req -nodes -new -x509 -keyout server.key -out server.certtest yazmanız gerekiyorsa dosyaları oluşturmak için çalıştırın )


-4
  1. Buradan kurulan openssl için rar dosyasını indirin: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Klasörünüzü c sürücüsüne kopyalamanız yeterlidir.
  3. Openssl.cnf dosyası oluşturun ve içeriğini şu adresten indirin: http://web.mit.edu/crypto/openssl.cnf openssl.cnf herhangi bir yere konabilir, ancak komut isteminde verdiğimizde yol doğru olmalıdır.
  4. Komut komutunu açın ve openssl.cnf yolunu ayarlayın C: \ set OPENSSL_CONF = d: /openssl.cnf 5. cmd olarak çalıştırın: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Ardından OpenSSL'yi çalıştırın> genrsa -des3 -out server.enc.key 1024
  6. Sonra geçiş ifadeleri isteyecektir: sertifika şifreniz olarak 4 ila 11 karakter girin
  7. Sonra bu openssl> req -new -key server.enc.key -out server.csr komutunu çalıştırın.
  8. Sonra ülke kodu devlet adı vb gibi bazı ayrıntıları isteyecektir serbestçe doldurun. 10. Sonra Çalıştır Opensl> rsa -in server.enc.key -out server.key
  9. Bu OpenSSL> x509 -req -gün 365 -in server.csr -signkey server.key -out server.crt dosyasını çalıştırın ve yığın taşması üzerinde olan önceki kodu kullanın Teşekkürler

1
bu OT . OP'nin sorusu açık. Sertifikalar zaten verildi.
Martin Schneider
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.