2011-10-26 14 views
6

He rastreado stackoverflow y el grupo express de google, pero todavía me estoy quedando corto.¿Cómo puedo configurar expressjs para manejar tanto http como https?

Por lo que sé, puedo hacer una de dos cosas:

1) Crear una instancia de un servidor HTTP y un servidor https y establecer los dos para escuchar a dos puertos diferentes. En las rutas, redirija la solicitud http al puerto 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) hacer lo que 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); 

Cuando hago 1, en general no hay problemas. Sin embargo, se siente torpe administrar dos servidores y realmente siento que debería haber una mejor manera.

Cuando hago 2, me sale esto:

(nodo SSL) Error: 1408A0C1: Rutinas SSL: SSL3_GET_CLIENT_HELLO: no compartida cifrado

Por supuesto, sólo puede defecto en la opción 1, pero realmente, realmente quiero saber por qué obtengo ese "error de cifrado compartido" cuando hago la opción 2. Y la opción 2 sería mi ruta preferida.

+0

terminé usando Nginx para manejar SSL. @Benjie El certificado es RSA. Voy a probar tu sugerencia en el futuro cercano. Gracias. – ant

+0

¿Podría indicar cómo configuró nginx para manejar ssl para el nodo? Gracias – Mamsaac

+0

La cosa es que no hiciste lo que dijo la esencia de TJ, casi, pero no exactamente. Las opciones de https deben dirigirse al servidor https, no al express.createServer. Entonces funciona Sin embargo, conseguirlo luego para trabajar con un servidor websocket es otra cosa completamente :) – youurayy

Respuesta

-1

¿Su certificado es un certificado RSA en lugar de uno DSA? Parece que los cifrados que admite su navegador no son compatibles con su servidor nodejs. ¿Es necesario actualizar su OpenSSL y volver a compilar NodeJS?

9

Siguiendo @ypocat 's comentario que puede activar HTTPS en su aplicación express.js al igual que

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

Tenga en cuenta que usted debe recibir server.ca-haz, server.key y server.crt de un certificado autoridad.

también como probablemente se quedará nodo sin sudo que necesita para asegurarse de que el puerto 80 (http) y 443 (https) están abiertos

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

y para reenviar solicitudes en 8080 a 80 y desde 8081 a 443 respectivamente

# 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 

esperanza esto ayuda

Cuestiones relacionadas