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.
Es posible que los atacantes estén intentando robar tu información de smart01.xxxxx.xxx (por ejemplo, contraseñas, mensajes o tarjetas de crédito). Más información
NET::ERR_CERT_AUTHORITY_INVALID
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
Este artículo fue reeditado el 18 de marzo para corregir los cambios existentes en Clouflare y acme.sh
Contenidos
Escenario usando Cloudflare
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.
Había algo que no cuadraba, y la ayuda en Virtualmin, en sus foros, en la red, no era muy alagüeña.
- Add Let’s Encrypt Certificate to Webmin (no funciona porque por el puerto 10000 no se puede ejecutar HTTP-01)
- Webmin is failing to use the LetsEncrypt SSL certificate generated from «SSL Encryption» section (bugs y más bugs)
- 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 configurando, 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)
$ cd /tmp
# git clone https://github.com/Neilpang/acme.sh.git
# cd acme.sh
# ./acme.sh --install --accountemail tu-correo-id@tu-dominio-correo
Crear nuestro token API de Cloudflare
Editado el 17 de Marzo 2021 – Nuevo método con CloudFlare
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 CloudflareSAVED_CF_Email -> Nuestro email de usuario de Cloudflare
CF_Key='bb1ec8f3ImAGiNaRiO4f12786d1597e99' CF_Email='mi_correo_tecnico@castris.com'
Como en todo las cosas cambian con el tiempo, y aprovecho que hoy tenía que actualizar a un cliente de Outsourcing su instalación de webmin, para corregir el nuevo modelo.
- Entre en Cloudflare
- Ir a nuestro perfil
- Tokens de API
- Crear token
- Crear token de api con la plantilla Editar Zona de DNS
- Comprobar el token generado
Al crear el token nuestro consejo es el siguiente, sobre todo si tenemos multiples dominios y/o multiples subdominios en un dominio, por seguridad.
- Permiso para Editar zona DNS
- Elegir un recurso de zona especifico
- Elegir una IP especifica (filtrado de ip)
Esta muy generalizado en los servidores en los que realizo auditorías, la dejadez por omisión de elementos que si bien son brechas mínimas de seguridad, puede llegar a ser grandes brechas. Si no se tiene una buena herramienta de gestión de recursos de sistemas, al final podemos olvidar que tenemos por ahí una llave API, que permite la edicíón de todos nuestro dominio y encima desde cualquier sitio. Imagínatelo!!! Menudo desastre.
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 --ocsp-must-staple --keylength 4096 -d hostname.midominio.com [Wed Mar 17 21:24:36 CET 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory [Wed Mar 17 21:24:36 CET 2021] Single domain='hostname.domain.fdqn' [Wed Mar 17 21:24:36 CET 2021] Getting domain auth token for each domain [Wed Mar 17 21:24:38 CET 2021] Getting webroot for domain='hostname.domain.fdqn' [Wed Mar 17 21:24:38 CET 2021] hostname.domain.fdqn is already verified, skip dns-01. [Wed Mar 17 21:24:38 CET 2021] Verify finished, start to sign. [Wed Mar 17 21:24:38 CET 2021] Lets finalize the order. [Wed Mar 17 21:24:38 CET 2021] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/116012875/8509137526' [Wed Mar 17 21:24:40 CET 2021] Downloading cert. [Wed Mar 17 21:24:40 CET 2021] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03fa004c3237206af92bc8cffaf9622c8582' [Wed Mar 17 21:24:40 CET 2021] Cert success. -----BEGIN CERTIFICATE----- MIIGPjCCBSagAwIBAgISA/oATDI3IGr5K8jP+vliLIWCMA0GCSqGSIb3DQEBCwUA MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD EwJSMzAeFw0yMTAzMTcxOTI0MzlaFw0yMTA2MTUxOTI0MzlaMB4xHDAaBgNVBAMT ... ... i9gCzGkO2ul4kwgwEQYIKwYBBQUHARgEBTADAgEFMA0GCSqGSIb3DQEBCwUAA4IB AQC1m+63A4s2hgzjYEePgWvue5sne8XS6n4D1DN3QvLr5WgQRyeeQmAGrG1n88Mn 5Na/fSD3vHCFyF7mOFq+raFot9NQkemIT5nefic1CnSKpf9AKp0LRcNdT7K5zk6g GM+45x3+mkJ1GHZ5ZGXEyLqK17DWwza7N2zquxb/dwaUBZNFC8T6rp+yuQQin9qA xsYWkplU7FcZN1Rd1Rc5kZarADhyl2q+sBV6pExm5B6dDKKOGABM2c9dMzlV10K0 qtKtQpJh1K5gUOK4JJG50h4lCF0JzDuG2ACPDT91vR6stNIxbUg7+0PC7KoLr/NK uRszqVFYCSs9K+y5fd/kFxtt -----END CERTIFICATE----- [Wed Mar 17 21:24:40 CET 2021] Your cert is in /root/.acme.sh/hostname.midominio.com/hostname.midominio.com.cer [Wed Mar 17 21:24:40 CET 2021] Your cert key is in /root/.acme.sh/hostname.midominio.com/hostname.midominio.com.key [Wed Mar 17 21:24:40 CET 2021] The intermediate CA cert is in /root/.acme.sh/hostname.midominio.com/ca.cer [Wed Mar 17 21:24:40 CET 2021] And the full chain certs is there: /root/.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
44 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Compobación en el shell de nuestro token
Cloudflare nos aporta un ejemplo rápido para poder verificar que nuestro token funciona, evitando así las típicas dudas cuando programamos una interacción con una API, que nos devolverá un json con un success enverdadero.
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer gdwbtx8e2kkkkkkkkaaaaaaaaaa8b6Ob6KT0LRuJ" \ -H "Content-Type:application/json" {"result":{"id":"13c3fede49jhkjahsdt0ef0c1a87106b1f","status":"active"},"success":true,"errors":[],"messages":[{"code":10000,"message":"This API Token is valid and active","type":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, en el que podemos acuir a Webmin -> Webmin Configuration -> SSL Encryption y poner en
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 backups, 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, Samuel Zeller de Unsplash.com y a Canva por su editor
Comparte este articulo en
Comments 7
Author
Hola el articulo es de 18 junio, 2019… desde entocnes ha llovido mucho.
Saludos.
Hola,
buen articulo. Pero hay una via más simple:
En el Webmin entre en la página «Webmin Configuration» en la pestaña «Let´s Encrypt»
bajo «Hostnames for certificate» su hostname(s)
bajo «Website root directory for validation file» activa «Other directory y entra el directorio de letsencrypt, que según estándar es «/etc/letsencrypt/keys».
Con éstas entras funciona directamente.
Author
Hola Philip.
Que haces si NO PUEDES ACCEDER A WEBMIN VIA NAVEGADOR?
De eso va el articulo.
Que tengas un buen día.
Lo siento. No me expliqué bien:
En el articulo dices: «En mi caso, el dominio que estaba configurado, lo tengo en una cuenta de Cloudflare»
Mi pregunta es: Si no tengo una cuenta en CLoudflare, cómo configuro el acme.sh?
Saludos
Author
Hola. No lo he probado en otros escenarios, pero en la pagina oficial del script acme.shtienes distintos proveedores y salidas.
Author
Con CloudFlare necesitas usar otro sistema
Mírate este enlace.
Saludos,
Hola,
Bueno el articulo pero cómo hacerlo sin usar cloudflare?