2011-10-26 27 views
6

Ho setacciato lo stackoverflow e il gruppo express google, ma sto ancora arrivando a breve.Come posso configurare expressjs per gestire sia http che https?

Da quanto ho capito, non posso fare una delle due cose:

1) creare un'istanza di un server HTTP e un server HTTPS e impostare il due per ascoltare due porte diverse. Nelle rotte, reindirizzare la richiesta http alla porta 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) fare quello che dice 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); 

Quando faccio 1, ci sono generalmente problemi. Tuttavia, è difficile gestire due server e credo davvero che ci dovrebbe essere un modo migliore.

Quando faccio 2, ottengo questo:

(nodo SSL) di errore: 1408A0C1: routine SSL: SSL3_GET_CLIENT_HELLO: no condiviso cifra

Naturalmente, posso solo per default l'opzione 1, ma io davvero, voglio davvero sapere perché ottengo quel "errore di cifratura condiviso" quando faccio l'opzione 2. E l'opzione 2 sarebbe la mia rotta preferita.

+0

ho finito per usare Nginx per gestire SSL. @ Benjie Il cert è RSA. Darò il tuo suggerimento una prova nel prossimo futuro. Grazie. – ant

+0

Puoi indicare come hai configurato nginx per gestire ssl per il nodo? Grazie – Mamsaac

+0

Il fatto è che non hai fatto quello che ha detto l'essenza di TJ - quasi, ma non esattamente. Le opzioni https devono andare sul server https, non su express.createServer. Quindi funziona. Tuttavia, farla funzionare con un server Websocket è completamente un'altra questione :) – youurayy

risposta

-1

Il certificato è un certificato RSA anziché uno DSA? Sembra che le cifre supportate dal tuo browser non siano supportate dal tuo server nodejs: hai bisogno di aggiornare OpenSSL e ricompilare NodeJS?

9

seguito @ypocat 's commento è possibile abilitare HTTPS nell'applicazione express.js in questo modo

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

noti che si dovrebbe ricevere server.ca-fascio, server.key e server.crt da un certificato autorità.

anche come si sarà probabilmente eseguito nodo senza sudo è necessario assicurarsi che la porta 80 (HTTP) e 443 (https) sono aperti

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

e per inoltrare le richieste di 8080-80 e 8081-443 rispettivamente

# 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 

Spero che questo aiuti

Problemi correlati