¿Problema con mail-receiver y certificado autofirmado?

Estoy intentando configurar el correo entrante para una instancia de Discourse autoalojada detrás de un proxy inverso (http(s), SMTP). Dominio público: public.example.com, host detrás del proxy inverso: internal.example.com. Seguí este manual pero estoy atascado potencialmente debido a un error de certificado. Estoy usando certificados autofirmados para el cifrado interno entre el proxy inverso y los contenedores de Discourse. El contenedor de correo parece tener un problema con el certificado autofirmado presentado por el contenedor de Discourse, aunque es un certificado en cadena. ¿Qué hice mal o cómo puedo depurar el problema más a fondo?
La salida de registro (relevante) del contenedor de correo (./launcher logs mail-receiver) es:

May 21 15:34:06 internal-mail-receiver postfix/qmgr[101]: BA3E16FDE7: from=<foo@example.com>, size=3836, nrcpt=1 (queue active)
<23>May 21 15:34:06 receive-mail[113]: Recipient: nobody@public.example.com<19>May 21 15:34:06 receive-mail[113]: Failed to POST the e-mail to https://internal.example.com/admin/email/handle_mail: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError)<19>May 21 15:34:06 receive-mail[113]:   /usr/lib/ruby/2.7.0/net/protocol.rb:44:in `connect_nonblock'
  /usr/lib/ruby/2.7.0/net/protocol.rb:44:in `ssl_socket_connect'
  /usr/lib/ruby/2.7.0/net/http.rb:1009:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/internal_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'May 21 15:34:06 internal-mail-receiver postfix/pipe[112]: BA3E16FDE7: to=<nobody@public.example.com>, relay=discourse, delay=0.39, delays=0.19/0.01/0/0.2, dsn=4.3.0, status=deferred (temporary failure)

La parte (relevante) del archivo de configuración mail-receiver.yml del contenedor de correo es:

env:
  POSTCONF_smtpd_tls_key_file:  /ssl/ssl.key
  POSTCONF_smtpd_tls_cert_file:  /ssl/ssl.crt
  POSTCONF_smtpd_tls_security_level: may

  DISCOURSE_MAIL_ENDPOINT: 'https://internal.example.com/admin/email/handle_mail'

volumes:
  - volume:
      host: /var/discourse/shared/standalone/ssl
      guest: /ssl

La clave privada ssl.key contiene la clave privada del servidor (interno). El certificado en cadena ssl.crt contiene: certificado de servidor + certificado de CA (como nuevo usuario no puedo subir un archivo, por lo tanto, actualmente no puedo proporcionar el ssl.crt).

Las variables de entorno smtpd_tls se relacionan con el servidor smtpd, es decir, la parte con la que interactuarán otros servidores de correo al entregar correos electrónicos. Cuando luego intenta entregar el correo electrónico al endpoint handle_mail en internal.example.com, lo que sea que Ruby esté usando no confía en su autoridad de certificación y, por lo tanto, no puede confiar en su certificado autofirmado.

Para que esto funcione, creo que tienes dos opciones. La primera es modificar mail-receiver.yml para incluir su certificado de CA raíz en el contenedor, de modo que Ruby confíe en él. No estoy seguro de memoria cómo se vería eso, pero básicamente sería lo mismo que hacer que Ruby confíe en una nueva CA en cualquier sistema Linux, excepto a través de ese archivo yml del contenedor.

La otra opción es simplemente cambiar DISCOURSE_MAIL_ENDPOINT de usar internal. a public., lo que hará que se conecte a través de su proxy, que presumiblemente tiene un certificado en el que podrá confiar por defecto.

2 Me gusta

¡Gracias por tu ayuda, funcionó de esa manera!
(inicialmente, mi yo ingenuo asumió que toda la comunicación entre los contenedores ocurriría directamente entre los dos contenedores de todos modos)

2 Me gusta

La comunicación ocurre directamente entre los dos contenedores, solo que configuraste tu contenedor de Discourse para usar HTTPS con un certificado autofirmado, lo que cambia el método de comunicación requerido.

1 me gusta

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