Webmin hostname SSL Let’s encrypt, yo lo hice así

Webmin, certificado SSL con letsencrypt para el hostname

Con las nuevas exigencias de uso de certificados SSL en la navegación uno de los viejos amigos de los administradores, Webmin, comenzó a dar problemas, ya que por defecto se instala con un certificado autofirmado, que además no pasa muchas configuraciones de seguridad de los navegadores más usuales. Quise instalar Let’s Encrypt en una máquina Ubuntu 18.04, pero me encontré lo de siempre: muchos post son copia de otros que no sirven para nada.

Te explico como lo  hice yo, y me funciono, para una Ubuntu 18.04, con Let’s Encrypt basado en DNS-01 challenge, con Cloudflare como nameserver del dominio, usando acme.sh

Escenario

Llevaba tiempo pasando de largo del problema de los certificados autofirmados de Webmin. Sabía que se podía usar Let’s Encrypt, pero como imaginaba, no iba a ser todo fácil.

Cuando llegue a su configuración algo fallaba.

Configuracion Webmin para Letsencrypt

Había algo que no cuadraba, y la ayuda en Virtualmin, en sus foros, en la red, no era muy alagüeña.

  • Website root directory for validation file.
    • Other directory, no ofrece algo real. La validación por desafío HTTP-01, requiere tener abierto el puerto 80 ó 443, para el hostname FDQN a validar. En principio esto supondría que en esa máquina, tenemos un servidor web, lo cual puede ser un escenario que no es el nuestro, y que dicho servidor tiene un virtualhost con dicho hostname. Por lo que no es valido para nuestro propósito.
    • Use DNS domains for validation. BIen, en un primer intento supuse con mucha alegría que webmin gestionaría todo. Que iluso. Asi que me quedaba, claro que el método de validación por desafío DNS-01 era lo más apropiado, y además me servía la práctica para mis futuras pruebas con Kubernetes.

acme.sh: Un simple script ACME

No quería perderme en un sin fin de paquetes, clientes oficiales y no oficiales de Let’s Encrypt, y dado que tengo clientes en diversos proveedores y registradores, opte por este script acme.sh

En mi caso, el dominio que estaba configurado, lo tengo en una cuenta de Cloudflare, que tiene un hermosa API, que me facilitaba las cosas, ya que la validación por desafío DNS-01 requiere una entrada TXT, y mejor si una vez validado el hostname, borramos la entrada de nuestra zona dns.

Instalar y configurar acme.sh

En un usuario (mejor por seguridad, no acostumbrarse a trabajar como root)

$ git clone https://github.com/Neilpang/acme.sh.git
$ cd acme.sh
$ ./acme.sh --install
$ nano ~/.acme.sh/account.conf

En el fichero de configuración account.conf debemos añadir, nuestros datos de la cuenta de Cloudflare que gestiona el dominio en cuestión, que podemos obtener en nuestro dashboard de usuario de Cloudflare, en profile.

  • SAVED_CF_key -> Global Key de nuestro usuario de Cloudflare
  • SAVED_CF_Email -> Nuestro email de usuario de Cloudflare
Cloudflare : Perfil : Keys
SAVED_CF_Key='bb1ec8f3ImAGiNaRiO4f12786d1597e99'
SAVED_CF_Email='mi_correo_tecnico@castris.com'

Ejecutar acme.sh

Salimos de la sesión actual, ya que el instalador realizó algunos cambios en nuestro fichero de configuración del shell. Ahora solo resta hacer la primera llamada con el script para generar el certificado.

$ acme.sh --issue --dns dns_cf -d hostname.midominio.com 
[Tue Jun 18 13:59:55 UTC 2019] Create account key ok.
[Tue Jun 18 13:59:55 UTC 2019] Registering account
[Tue Jun 18 13:59:56 UTC 2019] Registered
[Tue Jun 18 13:59:56 UTC 2019] ACCOUNT_THUMBPRINT='QNBkmwkqZ9idh6HnagWgCjNcBl-a6OHbLtQMHYHE1-E'
[Tue Jun 18 13:59:56 UTC 2019] Creating domain key
[Tue Jun 18 13:59:56 UTC 2019] The domain key is here: /home/miusuario/.acme.sh/hostname.midominio.com /hostname.midominio.com .key
[Tue Jun 18 13:59:56 UTC 2019] Single domain='hostname.midominio.com '
[Tue Jun 18 13:59:56 UTC 2019] Getting domain auth token for each domain
[Tue Jun 18 13:59:57 UTC 2019] Getting webroot for domain='hostname.midominio.com '
[Tue Jun 18 13:59:57 UTC 2019] Adding txt value: Czuij3DNT6W4muij71QwiW_o3Tdv_nCueooUcIAEzFI for domain:  _acme-challenge.hostname.midominio.com 
[Tue Jun 18 13:59:58 UTC 2019] Adding record
[Tue Jun 18 13:59:59 UTC 2019] Added, OK
[Tue Jun 18 13:59:59 UTC 2019] The txt record is added: Success.
[Tue Jun 18 13:59:59 UTC 2019] Let's check each dns records now. Sleep 20 seconds first.
[Tue Jun 18 14:00:20 UTC 2019] Checking hostname.midominio.com  for _acme-challenge.hostname.midominio.com 
[Tue Jun 18 14:00:20 UTC 2019] Domain hostname.midominio.com  '_acme-challenge.hostname.midominio.com ' success.
[Tue Jun 18 14:00:20 UTC 2019] All success, let's return
[Tue Jun 18 14:00:20 UTC 2019] Verifying: hostname.midominio.com 
[Tue Jun 18 14:00:23 UTC 2019] Success
[Tue Jun 18 14:00:23 UTC 2019] Removing DNS records.
[Tue Jun 18 14:00:23 UTC 2019] Removing txt: Czuij3DNT6W4muij71QwiW_o3Tdv_nCueooUcIAEzFI for domain: _acme-challenge.hostname.midominio.com 
[Tue Jun 18 14:00:25 UTC 2019] Removed: Success
[Tue Jun 18 14:00:25 UTC 2019] Verify finished, start to sign.
[Tue Jun 18 14:00:25 UTC 2019] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/59599481/579534319
[Tue Jun 18 14:00:26 UTC 2019] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/0351fda4c34yhsdgte748d69304ac2d938fce31
[Tue Jun 18 14:00:27 UTC 2019] Cert success.
-----BEGIN CERTIFICATE-----
MIIFVTCCBD2gAwIBAgISA1H9pMNl/OdI1pMErC2Tj84xMA0GCSqGSIb3DQEBCwUA
...
recortado por seguridad
...
d2gnfVTYtorRSI55sEHQ8KVeiYHgWQC8QA==
-----END CERTIFICATE-----
[Tue Jun 18 14:00:27 UTC 2019] Your cert is in  /home/miusuario/.acme.sh/hostname.midominio.com /hostname.midominio.com .cer 
[Tue Jun 18 14:00:27 UTC 2019] Your cert key is in  /home/miusuario/.acme.sh/hostname.midominio.com /hostname.midominio.com .key 
[Tue Jun 18 14:00:27 UTC 2019] The intermediate CA cert is in  /home/miusuario/.acme.sh/hostname.midominio.com /ca.cer 
[Tue Jun 18 14:00:27 UTC 2019] And the full chain certs is there:  /home/miusuario/.acme.sh/hostname.midominio.com /fullchain.cer 

Tarea Cron de renovación

acme.sh instalará por nosotros una tarea cron de verificación del estado de validez de nuestro certificado, con el fin de renovarlo cuando sea conveniente

40 0 * * * "/home/miusuario/.acme.sh"/acme.sh --cron --home "/home/miusuario/.acme.sh" > /dev/null

Configuración de webmin

Vía Webmin

Si tenemos acceso a webmin pese a las advertencias del problema con los certificados, como ejemplo usando Opera, podemos ir a Webmin -> Webmin Configuration -> SSL Encryption y poner en

Webmin :: Configuracion de Webmin :: Encriptación SSL

Vía shell en fichero de configuración

Puede ocurrir, que se nos atranque el acceso, que alguna vez puede pasar por poner algún valor inadecuado en la configuración SSL, y la única forma que nos queda es editar el fichero de configuración de Webmin, generalmente en /etc/webmin/miniserv.conf

keyfile=/home/miusuario/.acme.sh/hostname.midominio.com/hostname.midominio.com.key
certfile=/home/miusuario/.acme.sh/hostname.midominio.com/hostname.midominio.com.cer
extracas=/home/miusuario/.acme.sh/hostname.midominio.com/fullchain.cer

Tras esta acción tenemos que reiniciar el servicio webmin

$ sudo systemctl restart webmin

Consideraciones finales

El alcance de este artículo, no es la seguridad, sino salir adelante con un tema que es recurrente en muchas piezas de software que tienen que ver con el ecosistema de los servidores.

He dedicado un tiempo, porque imaginé que me serviría para afrontar varios escenarios, similares en los que me he encontrado con la misma historia. Con Proxmox, su manual no me funciono, y no sólo eso sino que tuve que echar hacia atrás mis backus, porque me dejo inestable el sistema. Así, que ese es la siguiente ampliación de este artículo, ya que en el fondo pero con algunas salvedades, es casi igual.

Créditos

Gracias por la imagen de portada, unsplash-logoSamuel Zeller de Unsplash.com y a Canva por su editor

Comparte este articulo en

Deja un comentario

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

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax