Problema com mail-receiver e certificado autoassinado?

Estou tentando configurar o recebimento de e-mails para uma instância Discourse auto-hospedada atrás de um proxy reverso (http(s), SMTP). Domínio público: public.example.com, host atrás do proxy reverso: internal.example.com. Segui este manual, mas estou preso, potencialmente devido a um erro de certificado. Estou usando certificados autoassinados para a criptografia interna entre o proxy reverso e os contêineres Discourse. O contêiner de e-mail parece ter um problema com o certificado autoassinado apresentado pelo contêiner Discourse, embora seja um certificado encadeado. O que fiz de errado ou como depurar o problema mais a fundo?
A saída de log (relevante) do contêiner de e-mail (./launcher logs mail-receiver) é:

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)

A parte (relevante) do arquivo de configuração mail-receiver.yml do contêiner de e-mail é:

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

A chave privada ssl.key contém a chave privada do servidor (interno). O certificado encadeado ssl.crt contém: certificado do servidor + certificado da CA (como um novo usuário, não tenho permissão para fazer upload de um arquivo, portanto, atualmente não posso fornecer o ssl.crt).

As variáveis de ambiente smtpd_tls estão relacionadas ao servidor smtpd, ou seja, a parte com a qual outros servidores de e-mail interagirão ao entregar e-mails. Quando ele tenta entregar o e-mail ao endpoint handle_mail em internal.example.com, o que quer que o Ruby esteja usando não confia na sua autoridade certificadora e, portanto, não pode confiar no seu certificado autoassinado.

Para que isso funcione, acho que você tem duas opções. A primeira é modificar mail-receiver.yml para incluir seu certificado de CA raiz no contêiner, de modo que o Ruby confie nele. Não tenho certeza de imediato como isso seria, mas seria basicamente o mesmo que fazer o Ruby confiar em uma nova CA em qualquer sistema Linux, exceto através desse arquivo yml do contêiner.

A outra opção é simplesmente alterar DISCOURSE_MAIL_ENDPOINT de usar internal. para public., fazendo com que ele se conecte através do seu proxy, que presumivelmente tem um certificado que ele poderá confiar por padrão.

2 curtidas

Obrigado pela ajuda, funcionou dessa forma!
(inicialmente, meu eu ingênuo assumiu que toda a comunicação entre os contêineres aconteceria diretamente entre os dois contêineres de qualquer maneira)

2 curtidas

A comunicação acontece diretamente entre os dois contêineres, é apenas que você configurou seu contêiner Discourse para usar HTTPS com um certificado autoassinado, o que altera o método de comunicação necessário.

1 curtida

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