https

Para poner en marcha un servidor https necesitamos el middleware https y los archivos del certificado: archivo .crt y el de la clave privada archivo .key.

En producción estos archivos deben haber sido emitidos por una organización confiable de certificación (CA). Hay varias de pago, pero Let’s encrypt nos permite obtener certificados de forma gratuita.

En desarrollo podemos generar un certificado autofirmado mediante openSSL. En Linux generaríamos los archivos con los siguientes comandos:

Creación de una clave privada de 2048 bits con el algoritmo AES-256:

openssl genrsa -aes256 -out certificado.pem 2048
            

Creación del CSR correspondiente:

openssl req -new -key certificado.pem -out certificado.csr
            

Firma del CSR generado en el paso anterior y obtención del archivo .crt:

openssl x509 -req -days 365 -in certificado.csr -signkey certificado.pem 
             -out certificado.crt
            

Generar el archivo .key:

openssl rsa -in certificado.pem -out certificado.key
            

Si colocamos ambos archivos en la carpeta de la aplicación el ejercicio anterior quedaría:

const express = require("express");
const handlebars = require("express-handlebars");
const session = require("express-session");
const fs = require("fs");
const https = require("https");

var app = express();

// activar handlebars
app.set("view engine", "handlebars");
app.engine("handlebars", handlebars());

// para poder recoger los datos enviados con post
app.use(express.urlencoded({ extended: true }));

app.use(session({ secret: "234Tr43s@", cookie: { signed: true, secure: true } }));
// recursos estáticos
app.use(express.static("public"));


app.get("/", function(req, res, next) {
    res.render("home", {
        layout: null
    });
});

app.post("/", function(req, res, next) {
    if ((req.body.user == "pp") && (req.body.password == "1234")) {
        req.session.user = "pp";
        res.redirect("/secreto");
    } else
        res.redirect("/");
});

function controlAcceso(req, res, next) {
    if (!req.session.user)
        res.redirect("/");
    else next();
}

app.get("/secreto", controlAcceso, function(req, res, next) {
    res.render("secreto", { layout: null });
});

//si llega aquí, es una página no encontrada
app.use(function(req, res, next) {
    res.type("text/plain");
    res.status(404);
    res.send("no encontrado");
});

https.createServer({
    key: fs.readFileSync('certificado.key'),
    cert: fs.readFileSync('certificado.crt')
}, app).listen(8080, function() {
    console.log("servbidor HTTPS funcionando en puerto 8080 ...");
});
            

Normalmente veremos a las aplicaciones node funcionando detrás de un servidor proxy, por ejemplo, nginx, que será el que se encargue de atender las peticiones exteriores forzando conexiones https. Este servidor hará peticiones en la intranet a nuestra aplicación node con http, y por lo tanto nuestra aplicación ya no tendrán implementar https.

e-mail:manjarrés