Pon en marcha un servidor https en Node.js con Express

Hoy explico cómo correr un servidor https en Node.js con Express. Supondré que tienes algunos conocimientos básicos de Node.js y de programación en general.

init

Pero también comentaremos algunas cosas desde el principio, así que si eres nuevo/a en este lenguaje, seguro que este post te será de utilidad. ¡Compártelo con tus amigos y amigas si es el caso!

Crear el archivo package.js

Así pues, lo primero de todo es ejecutar el comando init para crear el archivo package.json:

npm init

De este modo centralizamos la gestión de las dependencias y automatizamos esta tarea, cosa que siempre facilita el desarrollo de apps.

A continuación node nos hará algunas preguntas acerca de nuestra nueva aplicación.

En este ejemplo yo no me he molestado en introducir ninguna información y le he ido dando al intro todo el rato a medida que npm init me iba haciendo preguntas, así que node ha terminado creando este package.json:

{
  "name": "my-1st-https-server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

A medida que vayas instalando los módulos que requiere tu nueva aplicación, con el comando npm install, asegúrate de añadir el parámetro --save justo después.

package.json

Esto es para añadir el nuevo módulo al archivo package.json, lo que es muy cómodo, porque siempre que dispongas del package.json es muy fácil instalar todas las dependencias de golpe con el comando npm install.

Instalar el módulo express

Nuestro servidor web correrá sobre Express, un framework muy popular que sirve para desarrollar aplicaciones web con Node.js.

De acuerdo a lo que hemos dicho, el comando:

npm install express –-save

Instalará el módulo express y también actualizará el archivo package.json:

{
  "name": "my-1st-https-server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.13.3"
  }
}

Archivo index.js de un servidor http sencillo

Antes de desplegar nuestro primer servidor https, vamos a comenzar programando el servidor http más sencillo que te puedas imaginar. El código es este:

var express = require('express');

const PORT = 80;

var app = express();

app.listen(PORT, function(){
    console.log("My http server listening on port " + PORT + "...");
});

app.get('/foo', function(req, res){
    console.log('Hello, I am foo.');
});

Fíjate que por tratarse de un servidor http (no https), el programa quedará a la espera escuchando solicitudes en el puerto 80. Si todo va bien pues, cuando ejecutes el programa desde la consola:

node index.js

Tiene que salirte este mensaje:

My http server listening on port 80...

De modo que si abres un navegador web y ejecutas: http://localhost/foo

En la consola de node te saldrá:

Hello, I am foo.

¡Felicidades! Acabas de programar tu primer servidor http en Node.js.

Graduate

Crear un certificado digital de servidor seguro con OpenSSL

Pasemos ahora de http a https. El paso más importante consiste en crear un certificado digital autofirmado para nuestro servidor. Si esto es nuevo para ti, por favor, lee este post para aprender cómo hacerlo.

Cuando tengas los archivos de los certificados, cópialos en la carpeta raíz de tu proyecto Node.js, la misma que contiene el archivo index.js.

A continuación verás que yo utilizo my_cert.key para la clave y my_cert.crt para el certificado digital. El primero tiene que empezar con algo así:

-----BEGIN RSA PRIVATE KEY-----

Y el segundo, empieza más o menos de esta manera:

-----BEGIN CERTIFICATE-----

Instalar los módulos fs y https

Necesitamos los módulos fs y https:

npm install fs --save

npm install https --save

Finalmente, el código del servidor https es este:

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

const PORT = 443;
    
var app = express();

https.createServer({
    key: fs.readFileSync('my_cert.key'),
    cert: fs.readFileSync('my_cert.crt')
}, app).listen(PORT, function(){
    console.log("My https server listening on port " + PORT + "...");
});

app.get('/foo', function(req, res){
    console.log('Hello, I am foo.');
});

¡Y esto es todo por hoy! Hemos terminado montado dos servidores: un http y un https. Espero que hayas aprendido cosas nuevas y que el artículo de hoy te haya servido para montar tu primer servidor https, con Node.js y con Express.