Instalar SSL Let’s Encrypt en Debian

SSL / TLS (Secure Socket Layer / Transport Layer Security) son protocolos criptográficos que permiten establecer un canal de comunicación segura en Internet: web, correo, fax y mensajería instantánea

CA (Certificate Authoritative): entidad reconocida a nivel mundial encargada de generar certificados de seguridad para terceros.

CSR (Certificate Signing Request): es una solicitud de firmado de certificado a una CA.

Let’s Encrypt: es una autoridad de certificación (CA) gratuita, automatizada y abierta, disponible para beneficio público. Es un servicio proporcionado por Internet Security Research Group (ISRG).

Proporciona a las personas los certificados digitales que necesitan para habilitar HTTPS (SSL/TLS) en sus sitios web, de forma gratuita, de la manera más fácil de usar posible.

Principales características:

  • Gratis: cualquier persona que posea un dominio puede usar Let’s Encrypt para obtener un certificado de seguridad gratuito.
  • Automático: el proceso de obtención y renovación del certificado se puede realizar de forma automática.
  • Seguro: Let’s Encrypt promueve las mejores prácticas de seguridad TLS y garantizando una protección adecuada de los datos que se intercambian entre un dispositivo y otro.
  • Transparente: todos los certificados emitidos o revocados se registrarán públicamente y estarán disponibles para que cualquiera pueda inspeccionarlos.
  • Abierto: el protocolo de emisión y renovación automática se publica como un estándar abierto que otros pueden adoptar.
  • Cooperativo: al igual que los propios protocolos de Internet subyacentes, Let’s Encrypt es un esfuerzo conjunto para beneficiar a la comunidad, más allá del control de cualquier organización.

Cerbot: es una herramienta que permite obtener y renovar certificados Let’s Encrypt.

Le puede interesar:

Instalar Cerbot

$ sudo apt install certbot
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  python-pyicu python3-acme python3-certbot python3-configargparse python3-configobj python3-distutils python3-future python3-josepy python3-lib2to3 python3-mock python3-openssl python3-parsedatetime python3-pbr
  python3-requests-toolbelt python3-rfc3339 python3-setuptools python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
Suggested packages:
  python3-certbot-apache python3-certbot-nginx python-certbot-doc python-acme-doc python-configobj-doc python-future-doc python-mock-doc python-openssl-doc python3-openssl-dbg python-setuptools-doc
The following NEW packages will be installed:
  certbot python-pyicu python3-acme python3-certbot python3-configargparse python3-configobj python3-distutils python3-future python3-josepy python3-lib2to3 python3-mock python3-openssl python3-parsedatetime
  python3-pbr python3-requests-toolbelt python3-rfc3339 python3-setuptools python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
0 upgraded, 22 newly installed, 0 to remove and 105 not upgraded.
Need to get 1,937 kB of archives.
After this operation, 9,700 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

Obtener ayuda

$ certbot -h

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate. The most common SUBCOMMANDS and flags are:

obtain, install, and renew certificates:
    (default) run   Obtain & install a certificate in your current webserver
    certonly        Obtain or renew a certificate, but do not install it
    renew           Renew all previously obtained certificates that are near
expiry
    enhance         Add security enhancements to your existing configuration
   -d DOMAINS       Comma-separated list of domains to obtain a certificate for

  (the certbot apache plugin is not installed)
  --standalone      Run a standalone webserver for authentication
  (the certbot nginx plugin is not installed)
  --webroot         Place files in a server's webroot folder for authentication
  --manual          Obtain certificates interactively, or using shell script
hooks

   -n               Run non-interactively
  --test-cert       Obtain a test certificate from a staging server
  --dry-run         Test "renew" or "certonly" without saving any certificates
to disk

manage certificates:
    certificates    Display information about certificates you have from Certbot
    revoke          Revoke a certificate (supply --cert-path or --cert-name)
    delete          Delete a certificate

manage your account with Let's Encrypt:
    register        Create a Let's Encrypt ACME account
    update_account  Update a Let's Encrypt ACME account
  --agree-tos       Agree to the ACME server's Subscriber Agreement
   -m EMAIL         Email address for important account notifications

More detailed help:

  -h, --help [TOPIC]    print this message, or detailed help on a topic;
                        the available TOPICS are:

   all, automation, commands, paths, security, testing, or any of the
   subcommands or plugins (certonly, renew, install, register, nginx,
   apache, standalone, webroot, etc.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Configuraciones de Certbot

Cerbot usa la siguiente estructura de directorios para almacenar y administrar los certificados

En acme-staging se encuentra la configuración del entorno de prueba (opción –test-cert), use el entorno de prueba hasta asegurarse que puede obtener sus certificados de manera exitosa, una vez que el certbot le indique que los certficados han sido generados correctamente use el entorno de producción acme.

archive es el historial de todos los certificados obtenidos y renovados.

Dentro de live hay emlaces simbólico a archive, los mismos apuntan a las últimas versiones de los certificados obtenidos/renovados.

En renewal está la configuración que se usará en el proceso de renovación automática.

Ponga en renewal-hooks acciones que desea ejecutar antes, después o durante el proceso de renovación.

/etc/letsencrypt/
├── accounts
│   ├── acme-staging-v02.api.letsencrypt.org
│   │   └── directory
│   └── acme-v02.api.letsencrypt.org
│       └── directory
├── archive
├── csr
├── keys
├── live
├── renewal
└── renewal-hooks
    ├── deploy
    ├── post
    └── pre

Obtener certificado

Certbot dispone de varia opciones o formas de obtener una de ellas es usando la opción –webroot, para ello debemos tener una configuración similar a la siguiente en el fichero /etc/letsencrypt/cli.ini.

# Because we are using logrotate for greater flexibility, disable the
# internal certbot logrotation.
max-log-backups = 0
# This is an example of the kind of things you can do in a configuration file.
# All flags used by the client can be configured here. Run Certbot with
# "--help" to learn more about the available options.
#
# Note that these options apply automatically to all use of Certbot for
# obtaining or renewing certificates, so options specific to a single
# certificate on a system with several certificates should not be placed
# here.

# Use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096

# Uncomment and update to register with the specified e-mail address
# email = foo@example.com

# Uncomment to use the standalone authenticator on port 443
# authenticator = standalone

# Uncomment to use the webroot authenticator. Replace webroot-path with the
# path to the public_html / webroot folder being served by your web server.
authenticator = webroot
webroot-path = /var/www/letsencrypt

Ahora necesitamos crear el DIR /var/www/letsencrypt/.well-known/acme-challenge/ con

$ sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge/

Creamos un virtual host para el NGINX con la siguiente configuración:

server {
    listen 80;
    server_name midominio.com; 
    
    location / {
        return 301 https://$host$request_uri;
    }
    
    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
    }
}

Creamos un fichero de txt dentro de /var/www/letsencrypt/.well-known/acme-challenge/ para probar la configuración del NGINX

$ sudo echo OK > /var/www/letsencrypt/.well-known/acme-challenge/ok.txt

Recargue la configuración del NGINX con:

$ sudo service nginx reload

Ahora trate de acceder al fichero ok.txt desde el navegador con http://midominio.com/.well-known/acme-challenge/ok.txt si accedió de manera exisota entonces podemos pasar al siguiente paso que es obtener un certificado de prueba.

$ sudo certbot certonly --test-cert --cert-name midominio.com -d midominio.com,www.midominio.com,subdominio1.midominio.com

la opción –cert-name es para identificar el dominio dentro del DIR /etc/letsencrypt/ una vez que obtuvo los certificados de manera exitosa elimine la opción –test-cert y ejecute el comando nuevamente:

$ sudo certbot certonly --cert-name midominio.com -d midominio.com,www.midominio.com,subdominio1.midominio.com

Configurar el NGINX

Ahora estamos listo para configurar el NGINX para ellos nos guiamos por SSL Configuration Generator y seleccionamos la configuración Moderna, en caso que necesite mayor compatibilidad puede seleccionar la opción Intermedia.

server {
    listen 443 ssl http2;
    
    # SSL configuration
    ssl_certificate  /etc/letsencrypt/live/midominio.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/midominio.com/privkey.pem; 
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    # Absolute path of snippets DIR: /etc/nginx/snippets
    ssl_dhparam snippets/dhparam;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;	

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/letsencrypt/live/midominio.com/fullchain.pem; 
    
    # Put here you domain
    #
    server_name midominio.com;
    
    # Max file size useful for file uploading 
    # 
    client_max_body_size 8M;
    
    location / {
        # NGINX acting as reverse proxy
        #
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        #
        # Set the backend url and port, port is optional for standard services
        # when there is a variable as a part of proxy_pass URL a resolver is needed.
        #
        proxy_pass http://miurl.internal:port;
    }
}

Recargue la configuración del NGINX con:

$ sudo service nginx reload

Listar los certificados de seguridad

$ sudo certbot certificates

Renovar certificados de manera automática

Ahora que hemos configurado nuestro certificado de manera correcta debemos crear las configuraciones necesarias para que el proceso de renovación sea automático en el caso de Debian se crea una timer systemd como parte del proceso de instalación del paquete certbot puede inspeccionar este fichero con:

$ cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

Si su distribución no usa systemd entonces cree un bash script en /etc/cron.daily (en Alpine Linux ponga el script en /etc/periodic/daily)

#!/bin/sh
certbot renew

El fichero creado debe tener permisos de ejecución.

Enlaces de interés

YouTube video

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.