Autor Tema: [HOWTO] Luci con SSL oficial. También automático y gratis (LetsEncrypt) con acme  (Leído 327 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado peperfus

  • *****
  • Mensajes: 109
W A R N I N G
Citar
DISCLAIMER - EXCENCIÓN DE RESPONSABILIDAD
El presente tutorial / manual / howto, instrucciones o texto en general, carece de cualquier garantía y sólo está pensado como uso a modo educativo, de aprendizaje, experimentación, investigación y desarrollo.
Puede contener errores así como ambigüedades o falta de información precisa. En cualquier caso, las sugerencias, comentarios y críticas constructivas serán siempre bienvenidos.
El autor rechaza cualquier responsabilidad por cualquier tipo de daño, ya sea directo o indirecto, accidental o intencionado que la aplicación del siguiente texto pueda ocasionar.
Su uso está totalmente desaconsejado en entornos de producción a no ser, bajo la supervisión de un profesional debidamente cualificado y bajo su única responsabilidad.
La aplicación del presente texto en cualquier sistema, implica la total aceptación de estas condiciones.
Peperfus.

-----------------------------------------
Edito: Para instalación automática y desatendida mediante script, pasar a leer el cuarto post.
Para instalación manual, seguir leyendo este post.
-----------------------------------------

Tutorial de novato a novato.
Así es como lo he hecho yo y estoy contento, porque me ha funcionado prácticamente a la primera, después de solucionar algunos detallitos leves.

1) Necesitamos tener un dominio en Internet. Por ejemplo: openwrt.pepito.com
En la configuración del dominio, el email del admin debe ser estándard:
"admin@openwrt.pepito.com" (bueno, eso suponiendo que elijamos como método de validación del certificado la confirmación por email)
Y la dns, lo lógico es que apunte a la IP privada del router: (la típica suele ser 192.168.1.1) (si no queremos navegar por nuestro luci desde fuera de la LAN)
Citar
Nota:
Algunos DNS no admiten IPs privadas como resolución de nombres de dominio, por seguridad. Si este es el caso, se puede añadir la resolución al hosts del router para que nos lo resuelva localmente en la red.
En cambio de IP de un registro DNS puede tardar cierto tiempo. (A veces es inmediato).
Lo que sí tarda bastante (24... 48 horas) es cambiar el nameserver (NS) de un dominio.

2) Instalar:
Código: [Seleccionar]
opkg install  luci-ssl-openssl luci-app-uhttpd
3) Generar el certificado. Consta de 2 archivos: el certificado en sí y el que se envía para que nos lo firmen, que tiene extensión csr (certificate signing request (petición de firma de certificado))
Yo utilicé este comando, que me lo dio la CA de donde compré mi certificado y me fue bien:
Código: [Seleccionar]
openssl req -new -newkey rsa:2048 -nodes -keyout certificado.key -out certificado.csr
Se rellena el formulario con los datos (código de país, etc...)
Lo más IMPORTANTE es que el common name sea nuestro dominio: (openwrt.pepito.com)

4) Nos vamos a una CA (Autoridad Certificadora, una especie de "notario"), compramos el certificado más barato que haya (que sólo valide el dominio va que chuta) y seguimos sus instrucciones para que nos firme el csr. Si nos pregunta qué tipo de cifrado, elegimos OPENSSL (suele poner también nginx) Seguramente nos enviará un email a la dirección de admin del dominio con un código para confirmar la firma del cert. Hay muchísimas CAs por ahí en Internet, algunos tienen certificados muy baratos (el mío me costó unos 8$ al año), e incluso creo que hay hasta gratis y todo, aunque no lo he mirado porque los veía algo más complicados y como este em funcionó bien y 8$ al año no es dinero, pues me lo pillé.

5) Una vez validada nuestra identidad, nos envían el cert firmado por email*.

6) Nos vamos a luci, Services, uhttpd y lo configuramos:
Primero le damos al botón: "Remove configuration for certificate and key". Esto borra el certificado autofirmado generado por defecto y su configuración, para que tenga en cuenta la nueva configuración de nuestro cetificado firmado.
Yo le pongo que sólo escuche http por la IP de mi red privada
La ip https la misma, pero en puerto 443
IPv6 lo quito
Redirect http al https marcado.
Ignore tal... marcado.
Y luego le ponemos el archivo CRT que habíamos recibido de la CA y el key que habíamos generado.
Guardamos ...
Nos corta la conexión. Yo lo que hice fue forzar actualización de configuración. Y luego reinicié el uhttpd.
No funciona...
Porque la dns aún no nos resuelve a la IP. La solución temporal es ponerle en /etc/hosts la ip del router asociada al dominio:
192.168.1.1 openwrt.pepito.com
Reiniciar dnsmasq...
Y listo. En principio ya debería funcionar.

Probar en un navegador:
openwrt.pepito.com y debería redirigirnos a https y ponernos el candadito VERDE, diciéndonos que somos de fiar :)

(He hecho el tutorial de cabeza, no sé si me habré dejado algún paso o algo. De todas formas volveré a hacerlo siguiéndolo, a ver si me he dejado algo)
Edito: Probado otra vez y funcionando ok.

A disfrutar de conexión luci segura :)
Esto es bueno para asegurarnos de que el password viaje encriptado por la red y no nos lo puedan "piratear".


Certificado gratis para hacer pruebas::
https://www.sslforfree.com
Lo malo es que sólo dura 90 días. Por eso me he comprado uno.
Yo me lo he comprado de: c h e a p sslsecurity.com (he tenido que poner lo de c h e a p con espacios porque si lo ponía seguido, el foro me lo cambiaba a asteriscos, supongo que por algún filtro antispam o algo así)
Actualización: he probado el cert de sslforfree y también me ha funcionado OK.


Aver si alguien lo prueba y le funciona. La verdad es que está guay esto de tener el candadito verde reconocido oficialmente por el navegador para nuestro cacharro openwrt, le da más caché, más prestigio, jejejeje, además de pasar un buen rato aprendiendo. ;D

* También puede que nos lo muestren en pantalla, como una secuencia de filas de caracteres. Podemos copiar y pegar en el archivo, pero OJO. Al hacer esto desde Windows, cuando lo he pegado en un archivo, por ejemplo con el notepad++, me ha dado error el uhttpd. Creo que es por cosas del juego de caracteres de windows, o lo del fin de línea o algo de eso.
Lo que he hecho para que no me pase esto es:
Copiarlo desde la web y pegarlo en el putty conectado a open, en el archivo abierto.
nano certificado.crt
click derecho en el contenido del certificado en la web, seleccionar todo. Click derecho, copiar
Click derecho sobre el putty y directamente ya se pega.
Salir guardando el archivo y entonces lo coge ok.
(Y hacer lo mismo con el archivo key)


« Última modificación: 13-04-2019, 09:59 (Sábado) por peperfus »

Desconectado peperfus

  • *****
  • Mensajes: 109
Re:[HOWTO] Luci con SSL oficial
« Respuesta #1 en: 19-03-2019, 00:03 (Martes) »
Problema que me ha pasado: al reiniciar el router, no me iba el uhttpd. Cosa rara. Entro por ssh, reinicio el demonio y va.
Para arreglarlo, he editado manualmente el archivo /etc/config/uhttpd y he borrado las líneas de listen de IPv6 (que no las utilizo y estaban vacíos los corchetes).
He salido guardando los cambios y al reiniciar ya va.

Desconectado peperfus

  • *****
  • Mensajes: 109
Re:[HOWTO] Luci con SSL oficial
« Respuesta #2 en: 26-03-2019, 14:41 (Martes) »
Welcome to Bonus Stage!!

Pasos para conseguir un certificado SSL wildcard oficial gratis* desde cero y configurarlo para tener conexión segura con el luci de cualquiera de nuestros cacharros openwrt.
(Así es como lo he hecho yo) (Tutorial para Windows, aunque prácticamente compatible con linux)

  • Compramos un dominio (si no lo tenemos ya). Son baratos. Yo compré el mío en namebright.com y me cuesta unos 10 euros al año. A cambio de lo que me ofrece, para mí no es dinero. Para este ejemplo usaré: "midominio.com"
  • Nos vamos a solicitar el certificado wildcard a sslforfree.com (utiliza certificados de letsencrypt, pero lo hace mucho más fácil) y en el recuadro le ponemos un asterisco delante del dominio. Quedaría: *.midominio.com. Le damos a "Create Free SSL Certificate"
  • Le damos a Manual Verify domain (DNS) y nos pedirá que creemos un registro de tipo TXT en la DNS de nuestro dominio.
  • En otra pestaña, nos vamos al panel de control de nuestro dominio y creamos el registro de tipo TXT que nos ha dicho en el paso anterior:
    Citar
    Tipo: TXT
    Subdominio: _acme-challenge (normalmente no se incluye la parte del dominio, sólo el subdominio)
    Valor: (el que nos diga, que será una cadena de caracteres)
    (Obviamente, sustituir midominio.com por vuestro dominio correspondiente)
    Asignar el TTL a 1 segundo. Si no nos dejan, lo ponemos al mínimo que nos deje (por ejemplo, 1 hora) y tendremos que esperar para continuar. A veces está listo antes de pasar la hora completa. En este caso y si no podemos terminar el proceso, no hay problema, ya que el registro de petición de certificado queda almacenado y se puede continuar más adelante, aunque apaguemos el ordenador. En dicho caso, habría que repetir los pasos y debería salirnos el mismo valor del campo TXT para el DNS.
  • Una vez haya pasado el tiempo necesario, le damos a Download SSL Certificate. Como es un certificado que valida únicamente dominios, no vale la pena aportar un CSR propio, ya que los demás datos son ignorados. Nos mostrará en pantalla el certificado, compuesto por 2 claves: la clave pública (certificado) y la privada key. Ahora debemos copiarlas a sus correspondientes archivos, pero cuidado con el método, porque si quedan caracteres especiales residuales (saltos de línea de Windows, por ejemplo), nos dará error y nos volveremos locos hasta que nos demos cuenta (me ha pasado). Yo lo hice de esta manera y no me dio problemas:
    • 1) Click derecho sobre la secuencia del certificado (parte pública), seleccionar todo. Click derecho, copiar
    • 2) Nos vamos a putty, conectamos con el router del luci a proteger, y editamos un archivo en blanco: nano midominio.com.crt
    • 3) Click derecho sobre la pantalla negra del putty, para que pegue el certificado.
    • 4) Salimos guardando los cambios.
    • 5) Click derecho sobre la secuencia del certificado (parte privada, la key), seleccionar todo. Click derecho, copiar
    • 6) Nos vamos a putty otra vez, y ahora creamos el archivo de la clave privada: nano midominio.com.key
    • 7) Click derecho sobre la pantalla negra del putty, para que pegue el certificado.
    • 8 ) Salimos guardando los cambios.
    • 9) Abrimos Winscp y copiarnos ambos archivos a Windows, por ejemplo al escritorio. De esta manera no deberían darnos problemas. (Sé que es un proceso algo tedioso, pero de esta manera garantizamos que funcionen y no tengan caracteres ocultos raros)
  • Instalamos en el router: luci-ssl-openssl y luci-app-uhttpd (si no lo habíamos hecho antes)
  • En luci, nos vamos a services, uHTTPd (Si no aparece services, refrescar la página, o ir por ejemplo a Status, overview para que refresque)
  • Pulsar el botón "Remove configuration for certificate and key". (Este paso no es imprescindible, aunque si se omite, luego habrá que reiniciar uhttpd)
  • Configurar el resto de opciones de la siguiente manera:
    • HTTP LISTENER: Si lo dejamos en 0.0.0.0:80 escuchará en todas las direcciones. Yo prefiero decirle que sólo use la IP de la interfaz LAN (por ejemplo 192.168.1.2 o la que tengáis).
    • HTTPS LISTENER: Lo mismo, pero en el puerto 443
    • Redirect all HTTP to HTTPS: marcado si queréis forzar uso del SSL.
    • Ignore private IPs on public interface: Según uséis el dns (local o público, eso ya depende de la configuración de cada uno). Yo lo tengo marcado.
    • HTTPS Certificate: Examinar.... y se le carga el archivo crt que habíamos guardado antes en el escritorio.
    • HTTPS Private Key: Examinar.... y se le carga el key.
  • Y ya como último paso: pulsar SAVE AND APPLY
Si se queda "colgado", basta reiniciar el servicio uhttpd:
Código: [Seleccionar]
/etc/init.d/uhttpd restart(o reiniciar el router)

Y ahora sólo faltaría configurar nuestro DNS para que nos resuelva loquesea.midominio.com a su IP correspondiente. Por ejemplo:
192.168.1.2 firewall.midominio.com
Esto se puede hacer de varias maneras, por ejemplo añadiendo dicha entrada al archivo /etc/hosts.

* (El certificado es gratis, lo que sí hay que tener es un dominio registrado en Internet, aunque no es caro)
Como parte negativa, indicar que la validez de este certificado dura 3 meses, teniendo que renovarlo cuando caduque.
« Última modificación: 27-03-2019, 12:10 (Miércoles) por peperfus »

Desconectado peperfus

  • *****
  • Mensajes: 109
Re:[HOWTO] Luci con SSL oficial
« Respuesta #3 en: 31-03-2019, 17:43 (Domingo) »
WARNING: VERY HOT.
BONUS STAGE 2 !!

Generación e instalación AUTOMÁTICA de certificado LetsEncrypt.
Requisitos:
1) Ser conocedor de y asumir que no me hago responsable de cualquier daño que este script pueda ocasionar, ya sea por uso correcto o incorreco. Si no estás de acuerdo con esto, no sigas.
2) Tener un dominio en Internet.
3) Que dicho dominio apunte a nuestra IP.
4) O bien tener el router openwrt abierto a Internet (no suele ser el caso), o bien redirigir los puertos 80 y 443 del router principal al router openwrt de la red local (y habilitar el paso de dichos puertos en cualquier firewall intermedio y en el propio firewall openwrt) (Ojo: tener una contraseña fuerte y no hacer login al luci sin SSL mientras tanto)

Pasos:
1) "Descargar" este script al router openwrt:
(para pasarlo rápida y fácilmente al router: seleccionarlo todo, click derecho -> copiar, luego ir al router por ssh (Putty), editar un nuevo archivo y hacerle click derecho para pegarlo)
Código: [Seleccionar]
#!/bin/sh
# EDITAR:
DOMAIN=tudominio.com

if [ "$DOMAIN" == "tudominio.com"  ]; then
  echo Debes editar la variable DOMAIN a tu dominio ANTES de ejecutar el script.
  exit 1
fi

echo
sleep 1
echo
echo Este script instala AUTOMATICAMENTE y de forma desatendida la encriptación para luci con certificado SSL de LetsEncrypt.
echo Presione Ctrl + C ahora para cancelar la ejecución, otra tecla para omitir la espera
read -t16 -n1 -r -p "O espere 15 segundos para continuar... "
echo Alla vamos. . . .
sleep 3
clear
opkg update && opkg install luci-ssl-openssl  curl ca-bundle socat
sleep 1
echo
uci set uhttpd.main.redirect_https=1
echo
uci commit
echo
/etc/init.d/uhttpd restart
sleep 2
echo
curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh > acme.sh
sleep 2
echo
chmod a+x "acme.sh"
sleep 1
echo
./acme.sh --install
sleep 3
echo
cd /root/.acme.sh
sleep 1
# Abrimos los puerto de entrada al router: 80 y 443:
iptables -I input_rule -p tcp --dport 80 -j ACCEPT -m comment --comment ACME
iptables -I input_rule -p tcp --dport 443 -j ACCEPT -m comment --comment ACME
sleep 1
echo
./acme.sh --issue -d $DOMAIN -w /www
sleep 3
echo
#En caso de no querer cerrarlos, comentar las 4 siguientes lineas:
echo "Los puertos http (80) y https (443) quedan cerrados por seguridad."
echo Si el proceso ha tenido exito, puede abrirlos.
iptables -D input_rule -p tcp --dport 80 -j ACCEPT -m comment --comment ACME
iptables -D input_rule -p tcp --dport 443 -j ACCEPT -m comment --comment ACME
sleep 1
echo
uci set uhttpd.main.key="$(pwd)/$DOMAIN/$DOMAIN.key"
uci set uhttpd.main.cert="$(pwd)/$DOMAIN/$DOMAIN.cer"
uci commit uhttpd
sleep 1
echo
/etc/init.d/uhttpd restart
echo Script finalizado.
Modificar la línea que indica la variable DOMAIN=tudominio.com. Hay que cambiar tudominio.com por (efectivamente, esto es de sentido común, tu dominio  ^-^).
Guardar el archivo con el nomre que queráis, por ejemplo "instalarCertLetsEncrypt.sh" y salir.

2) Hacerlo ejecutable: chmod +x ./instalarCertLetsEncrypt.sh

3) Cruzar los dedos, coger aire, aguantar la respiración...
(Emoción, intriga, dolor de barriga....)

4) Ahora sí, ejecutar el script.

5) Si ha tenido éxito, abrirse una cocacola o una birrita fresquita y relajarse. En caso contrario, abrirse una cocacola o una birrita fresquita y relajarse.

Lo he probado 2 veces y me ha funcionado perfectamente, a la primera.
A ver si alguien lo prueba y confirma que también funciona.
Nota: si os sale un error como este:
Código: [Seleccionar]
crontab: can't open 'root': No such file or directory
crontab: can't open 'root': No such file or directory
Y luego os pone OK, no os preocupéis. Es porque no encuentra el archivo de crontabs de root, porque al principio no existe hasta que se crea la primera tarea programada. El programa la añade bien aunque salga el error.

Para renovar automáticamente el certificado, parece ser que el script de acme instala una línea en cron que lo hace, aunque según el autor del hilo de donde he sacado toda esta información, conviene editarlo de esta manera:

Citar
Step 4: Modify crontab (automatic renew)

Run crontab -e to edit your crontab (use something like export EDITOR="/usr/bin/nano" if vim isn't your style). Edit to:

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --pre-hook "iptables -I input_rule -p tcp --dport 443 -j ACCEPT -m comment --comment ACME" --post-hook "iptables -D input_rule -p tcp --dport 443 -j ACCEPT -m comment --comment ACME" --reloadcmd "/etc/init.d/uhttpd restart" >> /root/.acme.sh/log.txt 2>&1
(Aquí lo que añade a la línea que instala acme, es el prehook y el posthook, para abrir y cerrar el puerto 443, aunque no sé muy bien qué sentido tiene cerrarlo  ???. Otra cosa que hace que sí le veo sentido es añadir la opcion reloadcmd para que uhttpd se reinicie y coja el nuevo certificado)

Un saludo !

Créditos para: el autor de https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT, el muy honorable señor: xmax000. Lo he invitado a una cerveza porque se lo merece. Sí señor.  >:(
« Última modificación: 12-04-2019, 11:14 (Viernes) por peperfus »

Desconectado peperfus

  • *****
  • Mensajes: 109
Algunos simples scripts útiles (con el script acme ya presente):

Pedir certificado wildcard LetsEncrypt para midominio.com:

Archivo "issue.sh"
Código: [Seleccionar]
#!/bin/sh

DOMINIO=midominio.com
cd /root

echo SE PUEDE CREAR VARIOS REGISTROS TXT EN EL DNS CON EL MISMO VALOR EN HOST.
echo "En el caso de multidominio, hay que crearlos todos (ningun problema) para que valide cada uno."
echo
sleep 3
./acme.sh --issue -d *.$DOMINIO --dns -d $DOMINIO --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
Puede que dé error post-hook. En este caso no es importante.
Una vez ejecutado, nos mostrará los registros TXT que debemos crear, y sus valores correspondientes.
NOTA: Se puede crear 2 ó más registros TXT con el mismo host y coexistir al mismo tiempo, aunque tengan el mismo nombre.

Una vez creados los registros DNS de tipo TXT solicitados por LetsEncrypt, con sus campos host y value correspondientes, para renovarlo (modo DNS manual):
Archivo "renew.sh"
Código: [Seleccionar]
#!/bin/sh
DOMINIO=midominio.com
cd /root

./acme.sh --renew -d *.$DOMINIO --dns -d $DOMINIO --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

sleep 1
echo
echo Ahora conviene ejecutar el deploy para actualizar los archivos del certificado en los routers.

Y una vez conseguidos los archivos del certificado, podemos ejecutar este script desde el router principal (el que tiene el certificado), que los actualiza en todos los routers de nuestra red (los que le especifiquemos en la lista del for)
Archivo "deploy.sh"
Código: [Seleccionar]
#!/bin/sh

cert=/root/.acme.sh/*.midominio.com/*.midominio.com.cer
key=/root/.acme.sh/*.midominio.com/*.midominio.com.key

for router in router1.midominio.com router2.midominio.com router3.midominio.com routerN.midominio.com
do
  echo ROUTER $router:
  echo Parando uhttpd...
  ssh $router "\/etc\/init.d\/uhttpd stop"
  echo Instalando certificado...
  scp $cert $router:/etc/luci-uploads/cbid.uhttpd.main.cert
  scp $key  $router:/etc/luci-uploads/cbid.uhttpd.main.key
  echo Asignando permisos 600...
  ssh $router "chmod 600 \/etc\/luci\-uploads\/*.cert"
  ssh $router "chmod 600 \/etc\/luci\-uploads\/*.key"
  echo Arrancando uhttpd...
  ssh $router "\/etc\/init.d\/uhttpd start"
  echo ------------------------------------------------------
  sleep 1
  echo
done

echo ROUTER actual:
echo Parando uhttpd...
/etc/init.d/uhttpd stop
echo Instalando certificado y asignando permisos
mv $cert /etc/luci-uploads/cbid.uhttpd.main.cert
mv $key /etc/luci-uploads/cbid.uhttpd.main.key
chmod 600 /etc/luci-uploads/*.cert
chmod 600 /etc/luci-uploads/*.key
echo Arrancando uhttpd....
/etc/init.d/uhttpd start
echo --------------------------------------------------------
(Se recomienda mucho configurar el router principal con passwordless login desde openwrt a openwrt para que el script acceda directamente sin preguntar login y password)

Si queréis que se ejecute el deploy automáticamente después de renovar el certificado, creo que basta con añadir el parámetro " --renew-hook /root/deploy.sh" al final de la línea del acme en el script renew.sh. (Esto no lo he probado, pero creo que debería funcionar)

Espero que le sirvan a alguien. Para mí son muy prácticos porque me ahorra teclear bastante y me automatiza algunas cosas.

« Última modificación: 13-04-2019, 09:49 (Sábado) por peperfus »