Let's encrypt fallando para IP detrás del firewall

Hola a todos,

Después de instalar Discourse, recibo un HTTP 502 y el registro dice:

$ sudo ./launcher logs app
Se detectó la arquitectura x86_64.
run-parts: ejecutando /etc/runit/1.d/00-ensure-links
run-parts: ejecutando /etc/runit/1.d/00-fix-var-logs
run-parts: ejecutando /etc/runit/1.d/01-cleanup-web-pids
run-parts: ejecutando /etc/runit/1.d/anacron
run-parts: ejecutando /etc/runit/1.d/cleanup-pids
Limpiando archivos PID obsoletos
run-parts: ejecutando /etc/runit/1.d/copy-env
run-parts: ejecutando /etc/runit/1.d/letsencrypt
[Mar 06 Jun 2023 01:51:07 PM UTC] Usando CA: https://acme-v02.api.letsencrypt.org/directory
[Mar 06 Jun 2023 01:51:07 PM UTC] Clave de cuenta creada correctamente.
[Mar 06 Jun 2023 01:51:07 PM UTC] Registrando cuenta: https://acme-v02.api.letsencrypt.org/directory
[Mar 06 Jun 2023 01:51:09 PM UTC] Registrado
[Mar 06 Jun 2023 01:51:09 PM UTC] ACCOUNT_THUMBPRINT='V5GxRKC8yO-5jvYjc3WlSSMbTABmaNtxUNs8XVoL1R8'
[Mar 06 Jun 2023 01:51:09 PM UTC] Creando clave de dominio
[Mar 06 Jun 2023 01:51:10 PM UTC] La clave de dominio está aquí: /shared/letsencrypt/<mi dominio>/<mi dominio>.key
[Mar 06 Jun 2023 01:51:10 PM UTC] Dominio único='<mi dominio>'
[Mar 06 Jun 2023 01:51:10 PM UTC] Obteniendo token de autenticación de dominio para cada dominio
[Mar 06 Jun 2023 01:51:13 PM UTC] Obteniendo webroot para el dominio='<mi dominio>'
[Mar 06 Jun 2023 01:51:13 PM UTC] Verificando: <mi dominio>
[Mar 06 Jun 2023 01:51:15 PM UTC] Pendiente, la CA está procesando su pedido, por favor espere. (1/30)
[Mar 06 Jun 2023 01:51:19 PM UTC] Pendiente, la CA está procesando su pedido, por favor espere. (2/30)
[Mar 06 Jun 2023 01:51:23 PM UTC] Pendiente, la CA está procesando su pedido, por favor espere. (3/30)
[Mar 06 Jun 2023 01:51:27 PM UTC] <mi dominio>:Error de verificación:202.117.43.203: Obteniendo http://<mi dominio>/.well-known/acme-challenge/UuD6jm6XJAaoXG7lE_IKfNVuHtqB4dokQXm-ll0bmrk: Tiempo de espera agotado durante la conexión (probablemente problema de firewall)
[Mar 06 Jun 2023 01:51:27 PM UTC] Por favor, revise el archivo de registro para más detalles: /shared/letsencrypt/acme.sh.log
No se puede abrir ca.cer para lectura, No existe tal archivo o directorio
140104391968064:error:02001002:sistema library:fopen:No such file or directory:../crypto/bio/bss_file.c:69:fopen('ca.cer','r')
140104391968064:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:76:
no se puede cargar el certificado
Error al cargar el archivo /dev/fd/63

...
nginx: [emerg] no se puede cargar el certificado "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() falló (SSL: error:0909006C:PEM routines:get_name:no start line:Esperando: TRUSTED CERTIFICATE)
nginx: [emerg] no se puede cargar el certificado "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() falló (SSL: error:0909006C:PEM routines:get_name:no start line:Esperando: TRUSTED CERTIFICATE)
nginx: [emerg] no se puede cargar el certificado "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() falló (SSL: error:0909006C:PEM routines:get_name:no start line:Esperando: TRUSTED CERTIFICATE)

Supongo que esto sucede porque Discourse intenta generar un certificado automáticamente y verificarlo en modo HTTP, accediendo a la URL listada. Sin embargo, mi IP está detrás del firewall de una institución y, por lo tanto, no puede permitir el acceso a IPs externas, ni tampoco la CA.

También aprendí en el sitio web de Let’s Encrypt que el desafío DNS se puede usar si HTTP no está disponible, pero no estoy seguro de cómo hacerlo en Discourse.

Gracias.

1 me gusta

Tienes razón.

Deberías haber recibido una advertencia de Discourse-setup diciendo que no pudo conectarse.

No está soportado. Si quieres ejecutarlo detrás de un firewall, necesitarás encontrar alguna otra forma de obtener un certificado. Puedes ver Permitir SSL / HTTPS para tu configuración de Discourse Docker

1 me gusta

Hola @pfaffman , ¡muchas gracias por tu información! Siguiendo las instrucciones de esa publicación, la página de bienvenida de Discourse finalmente aparece.

Solo queda un pequeño problema: uso Cloudflare para generar un certificado para el servidor de origen. Pero cuando intento acceder a la página desde el navegador, me da una advertencia NET::ERR_CERT_AUTHORITY_INVALID (aunque puedo continuar ignorándola, pero mis usuarios probablemente no querrán hacerlo).

Me pregunto si este problema tiene algo que ver con Discourse y tengo curiosidad sobre los métodos para depurar este problema. Gracias.

Además, como sshd.template.yml está obsoleto, tengo que editar manualmente /etc/nginx/conf.d/discourse..conf para modificar ssl_certificate y ssl_certificate_key para que apunten a /shared/ssl/ssh.crt y /shared/ssl/ssh.key (el valor predeterminado es /shared/ssl/<nombre de dominio>.cer), de lo contrario, nginx no funcionará debido a problemas con el certificado, quejándose de algo como:

[emerg] 5834#5834: cannot load certificate "/shared/ssl/<nombre de dominio>.cer": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)

Estoy pensando si este será el punto que causa problemas.

No necesitas la plantilla sshd y deberías eliminar la referencia a ella.

Simplemente modificarás las otras líneas recomendadas para poner la información correcta en la configuración de nginx.

Si estás recibiendo un error de que el certificado no es válido, ese es probablemente el problema. Necesitarás un certificado válido.

1 me gusta

Solo necesitas usar la plantilla web.ssl (y no la plantilla web.letsencrypt.ssl). El archivo yml de ejemplo tiene las siguientes líneas:

  ## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Simplemente descomenta la primera:

  ## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Eso configurará nginx para SSL usando /shared/ssl/ssl.crt y /shared/ssl/ssl.key. Con eso, solo necesitas asegurarte de tener un certificado y una clave válidos en esas rutas. Suponiendo que hayas instalado en la ubicación estándar, la ruta a ese directorio en el sistema host es /var/discourse/shared/standalone/ssl/.

2 Me gusta

Gracias Jay y Simon, mi problema está resuelto.

Al final del día, descubrí que el certificado de Cloudflare era el culpable. Cambiar al desafío DNS a través de Let’s Encrypt funciona de maravilla.

Ahora tengo un poco más de conocimiento sobre cómo funciona Discourse internamente. ¡Genial!


Actualización: Por cierto, ¿es posible permitir a los usuarios elegir cómo generarán su certificado en el proceso de configuración? Para los recién llegados como yo, tendremos que leer y encontrar los registros para descubrir que los certificados conducen a fallos de conexión.

2 Me gusta

No. La configuración está diseñada para una forma sencilla de instalarlo que (casi siempre) funciona. La instalación detrás de un firewall que no permite el acceso desde la web pública es una configuración que será difícil de soportar.

¡Me alegra que lo hayas solucionado!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.