2011-10-26 12 views
6

Przeszukałem stackoverflow i ekspresową grupę google, ale wciąż mam mało.Jak skonfigurować program expressjs do obsługi zarówno protokołu http, jak i HTTPS?

Z czego wnoszę, mogę zrobić jedną z dwóch rzeczy:

1) Utwórz instancję serwera HTTP i serwera https i ustawić dwa słuchać dwóch różnych portów. Na trasach przekieruj żądanie http do portu https.

//app 
var app = express.createServer(); 
var app_secure = express.createServer({key: key, cert: cert}); 

app.listen(8080); 
app_secure.listen(8443); 

//routes 
app.get("unsecure/path", function(req, res) { 
    ... 
} 

app.get("secure/path", function(req, res) { 
    res.redirect("https://domain" + req.path); 
} 

app_secure.get("secure/path", function(req, res) { 
    res.send("secure page"); 
} 

2) to, co mówi TJ Hollowaychuk: https://gist.github.com/1051583

var http = require("http"); 
var https = require("https"); 
var app = express.createServer({key: key, cert: cert}); 

http.createServer(app.handle.bind(app)).listen(8080); 
https.createServer(app.handle.bind(app)).listen(8443); 

Kiedy zrobić 1, są na ogół żadnych problemów. Jednak czujesz się niezdolny do zarządzania dwoma serwerami i naprawdę uważam, że powinien istnieć lepszy sposób.

Kiedy zrobić 2, otrzymuję ten:

(węzeł SSL) błąd: 1408A0C1: podprogramów SSL: SSL3_GET_CLIENT_HELLO: nie podzielił szyfr

Oczywiście, mogę tylko domyślnie opcji 1, ale naprawdę, naprawdę chcę wiedzieć, dlaczego otrzymuję ten "brak współdzielonego błędu szyfrowania", kiedy robię opcję 2. A opcja 2 byłaby moją preferowaną trasą.

+0

I skończył przy użyciu Nginx do obsługi protokołu SSL. @Benjie The cert is RSA. Podam Twoją sugestię w najbliższej przyszłości. Dzięki. – ant

+0

Czy możesz wskazać, jak skonfigurowałeś nginx do obsługi ssl dla węzła? Dzięki – Mamsaac

+0

Czy nie zrobiłeś tego, co powiedział TJ - prawie, ale nie do końca. Opcje https muszą przejść do serwera https, a nie do express.createServer. Wtedy to działa. Jednak uzyskanie go do pracy z serwerem websocket to zupełnie inna sprawa :) – youurayy

Odpowiedz

-1

Czy twój certyfikat jest certyfikatem RSA, a nie DSA? Wygląda na to, że szyfry obsługiwane przez przeglądarkę nie są obsługiwane przez serwer nodejs - trzeba zaktualizować OpenSSL i ponownie skompilować NodeJS?

9

Po @ypocat „s skomentować można włączyć https w aplikacji express.js jak tak

var http = require('http'); 
var https = require('https'); 
var express = require('express'); 
var fs = require('fs'); 

var app = express.createServer(); 

// cutomize your app as ususal 
app.configure(function() { ... }); 
app.configure('production', function() { ... }); 
// .... 

// attach express handler function to TWO servers, one for http and one for https 
http.createServer(app.handle.bind(app)).listen(8080); 
https.createServer({ 
    ca: fs.readFileSync('./server.ca-bundle'), 
    key: fs.readFileSync('./server.key'), 
    cert: fs.readFileSync('./server.crt') 
}, app.handle.bind(app)).listen(8081); 

Zauważ, że powinieneś otrzymać server.ca-Bundle server.key i server.crt z certyfikatem autorytet.

także jak będzie prawdopodobnie uruchomić węzeł bez sudo trzeba się upewnić, port 80 (HTTP) i 443 (https) są otwarte

# in Ubuntu 
sudo ufw status 
sudo ufw allow 80 
sudo ufw allow 443 

i do przekazania wniosków na 8080 do 80 i od 8081 do 443 odpowiednio

# in Ubuntu 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8081 

Nadzieja to pomaga

Powiązane problemy