Configurar Let's Encrypt para Express

Cómo configurar HTTPS usando la popular solución gratuita Let's Encrypt

Si ejecuta una aplicación Node.js en su propio VPS, necesitará una solución para obtener certificados SSL.

Hoy en día, el estándar para hacer esto es usarVamos a cifraryCertbot, una herramienta deEFF, también conocida como Electronic Frontier Foundation, la principal organización sin fines de lucro centrada en la privacidad, la libertad de expresión y las libertades civiles en general en el mundo digital.

Estos son los pasos que seguiremos:

Instalar Certbot

Estas instrucciones asumen que está usando Ubuntu, Debian o cualquier otra distribución de Linux que useapt-getpara administrar paquetes:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

También puede instalar Certbot en una Mac, con fines de prueba (requiereCerveza casera):

brew install certbot

Sin embargo, deberá vincularlo a un nombre de dominio real para que sea útil.

Genere el certificado SSL usando Certbot

Ahora que Certbot está instalado, puede invocarlo para generar el certificado. Debes ejecutar esto como root:

certbot certonly --manual

... o llame a sudo desde un usuario no root:

sudo certbot certonly --manual

Este es el proceso en detalle:

El instalador le pedirá que proporcione el dominio de su sitio web.

... luego le pide su correo electrónico:

➜ sudo certbot certonly --manual
Password: XXXXXXXXXXXXXXXXXX
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

… Y aceptar los ToS:

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory

(A)gree/©ancel: A

... y por permiso para compartir su dirección de correo electrónico:

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

… Finalmente, podemos ingresar al dominio donde queremos usar el certificado SSL:

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): copesflavio.com

... el instalador pregunta si está bien registrar su dirección IP:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for copesflavio.com

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you’re running certbot in manual mode on a machine that is not your server, please ensure you’re okay with that.

Are you OK with your IP being logged?


(Y)es/(N)o: y

… ¡Y finalmente llegamos a la fase de verificación!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

And make it available on your web server at this URL:

http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E

Ahora, dejemos a Certbot solo durante un par de minutos.

Necesitamos verificar que somos dueños del dominio, creando un archivo llamadoTS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2Een el.well-known/acme-challenge/carpeta. ¡Prestar atención! La extraña cadena que acabo de pegar cambiará cada vez que pases por este proceso.

Deberá crear la carpeta y el archivo, ya que no existen de forma predeterminada.

En este archivo debe colocar el contenido que imprimió Certbot:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

En cuanto al nombre del archivo, esta cadena es única cada vez que ejecuta Certbot.

Permitir que Express sirva archivos estáticos

Para servir ese archivo desde Express, debe habilitar el servicio de archivos estáticos. Puedes crear unstaticcarpeta, y agregue allí el.well-knownsubcarpeta, luego configure Express así:

const express = require('express')
const app = express()

//… app.use(express.static(__dirname + ‘/static’, { dotfiles: ‘allow’ }))

//…

losdotfilesla opción es obligatoria de lo contrario.well-known, que es un archivo de puntos (ya que comienza con un punto), no se hará visible. Esta es una medida de seguridad, porque los archivos dot pueden contener información confidencial y se conservan mejor de forma predeterminada.

Confirma el dominio

Ahora ejecute la aplicación y asegúrese de que se pueda acceder al archivo desde la Internet pública. Regrese a Certbot, que aún se está ejecutando, y presione ENTER para continuar con el script.

Obtenga el certificado

¡Eso es! Si todo salió bien, Certbot creó el certificado y la clave privada, y los puso a disposición en una carpeta en su computadora (y le dirá qué carpeta, por supuesto).

Ahora, simplemente copie / pegue las rutas en su aplicación para comenzar a usarlas para atender sus solicitudes:

const fs = require('fs')
const https = require('https')
const app = express()

app.get(’/’, (req, res) => { res.send(‘Hello HTTPS!’) })

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Tenga en cuenta que hice que este servidor escuchara en el puerto 443, por lo que debe ejecutarse con permisos de root.

Además, el servidor se ejecuta exclusivamente en HTTPS, porque uséhttps.createServer(). También puede implementar un servidor HTTP junto con esto, ejecutando:

http.createServer(app).listen(80, () => {
  console.log('Listening...')
})

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Configurar la renovación

El certificado SSL solo tendrá una validez de 90 días, por lo que debe configurar un sistema automatizado para renovarlo.

¿Cómo? Usando un trabajo cron.

Un trabajo cron es una forma de ejecutar tareas en un intervalo de tiempo específico. Puede ser cada semana, cada minuto, cada mes, etc.

En nuestro caso, ejecutaremos el script de renovación dos veces al día, como se recomienda en la documentación de Certbot.

Primero, descubra el camino absoluto decertboten su sistema. yo suelotype certboten macOS para conseguirlo, y en mi caso está en/usr/local/bin/certbot.

Aquí está el script que necesitamos ejecutar:

certbot renew

Esta es la entrada del trabajo cron:

0 */12 * * * root /usr/local/bin/certbot renew >/dev/null 2>&1

Lo anterior dice 'ejecutarlo cada 12 horas, todos los días: a las 00:00 y a las 12:00'.

Consejo: generé esta línea usandohttps://crontab-generator.org/

Agregue su script recién creado al crontab del sistema usando este comando:

env EDITOR=pico crontab -e

Esto abre elpicoeditor (siéntase libre de sustituirlo por el editor que prefiera). Simplemente ingrese el nuevo script, guárdelo y se instalará el trabajo cron.

Una vez hecho esto, puede ver la lista de trabajos cron activos ejecutando:

crontab -l

Descarga mi gratisManual de Express.js


Más tutoriales rápidos: