Let's encrypt falhando para IP atrás do firewall

Olá a todos,

Após instalar o Discourse, recebo um HTTP 502, e o log diz:

$ sudo ./launcher logs app
x86_64 arch detected.
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
run-parts: executing /etc/runit/1.d/cleanup-pids
Cleaning stale PID files
run-parts: executing /etc/runit/1.d/copy-env
run-parts: executing /etc/runit/1.d/letsencrypt
[Tue 06 Jun 2023 01:51:07 PM UTC] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Tue 06 Jun 2023 01:51:07 PM UTC] Create account key ok.
[Tue 06 Jun 2023 01:51:07 PM UTC] Registering account: https://acme-v02.api.letsencrypt.org/directory
[Tue 06 Jun 2023 01:51:09 PM UTC] Registered
[Tue 06 Jun 2023 01:51:09 PM UTC] ACCOUNT_THUMBPRINT='V5GxRKC8yO-5jvYjc3WlSSMbTABmaNtxUNs8XVoL1R8'
[Tue 06 Jun 2023 01:51:09 PM UTC] Creating domain key
[Tue 06 Jun 2023 01:51:10 PM UTC] The domain key is here: /shared/letsencrypt/<my domain>/<my domain>.key
[Tue 06 Jun 2023 01:51:10 PM UTC] Single domain='<my domain>'
[Tue 06 Jun 2023 01:51:10 PM UTC] Getting domain auth token for each domain
[Tue 06 Jun 2023 01:51:13 PM UTC] Getting webroot for domain='<my domain>'
[Tue 06 Jun 2023 01:51:13 PM UTC] Verifying: <my domain>
[Tue 06 Jun 2023 01:51:15 PM UTC] Pending, The CA is processing your order, please just wait. (1/30)
[Tue 06 Jun 2023 01:51:19 PM UTC] Pending, The CA is processing your order, please just wait. (2/30)
[Tue 06 Jun 2023 01:51:23 PM UTC] Pending, The CA is processing your order, please just wait. (3/30)
[Tue 06 Jun 2023 01:51:27 PM UTC] <my domain>:Verify error:202.117.43.203: Fetching http://<my domain>/.well-known/acme-challenge/UuD6jm6XJAaoXG7lE_IKfNVuHtqB4dokQXm-ll0bmrk: Timeout during connect (likely firewall problem)
[Tue 06 Jun 2023 01:51:27 PM UTC] Please check log file for more details: /shared/letsencrypt/acme.sh.log
Can't open ca.cer for reading, No such file or directory
140104391968064:error:02001002:system 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:
unable to load certificate
Error loading file /dev/fd/63

...
nginx: [emerg] cannot load certificate "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/ics.yhdang.top.cer": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)

Presumo que isso aconteça porque o Discourse tenta gerar um certificado automaticamente e verificá-lo no modo HTTP, acessando o URL listado. No entanto, meu IP está sob um firewall institucional e, portanto, não pode permitir que IPs externos acessem, nem a CA.

Também aprendi no site da Let’s Encrypt que o desafio DNS pode ser usado se o HTTP não estiver disponível, mas não tenho certeza de como fazer isso no Discourse.

Obrigado.

Você está correto.

Você deveria ter recebido um aviso do Discourse-setup dizendo que não conseguiu se conectar.

Não é suportado. Se você quiser executar atrás de um firewall, precisará encontrar outra maneira de obter um certificado. Você pode ver Permitir SSL / HTTPS para sua configuração Docker do Discourse

Olá @pfaffman , muito obrigado pelas suas informações! Seguindo as instruções desse post, a página de boas-vindas do Discourse finalmente aparece.

Resta apenas um pequeno problema: uso o Cloudflare para gerar um certificado para o servidor de origem. Mas quando tento acessar a página pelo navegador, ele exibe um aviso NET::ERR_CERT_AUTHORITY_INVALID (embora eu possa prosseguir ignorando-o, mas meus usuários provavelmente não vão querer).

Estou me perguntando se esse problema tem algo a ver com o Discourse e estou curioso sobre os métodos para depurar esse problema. Obrigado.

Além disso, como sshd.template.yml está obsoleto, tenho que editar manualmente /etc/nginx/conf.d/discourse..conf para modificar ssl_certificate e ssl_certificate_key para apontar para /shared/ssl/ssh.crt e /shared/ssl/ssh.key (o valor padrão é /shared/ssl/<nome do domínio>.cer), caso contrário, o nginx não funcionará devido a problemas de certificado, reclamando como:

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

Estou pensando se este será o ponto que causa problemas.

Você não precisa do template sshd e deve remover a referência a ele.

Você apenas modificará as outras linhas recomendadas para colocar as informações corretas na configuração do nginx.

Se você estiver recebendo um erro de que o certificado é inválido, esse é provavelmente o problema. Você precisará de um certificado válido.

Você só precisa usar o template web.ssl (e não o template web.letsencrypt.ssl). O arquivo yml de exemplo tem as seguintes linhas:

  ## Descomente estas duas linhas se desejar adicionar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Apenas descomente a primeira:

  ## Descomente estas duas linhas se desejar adicionar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Isso configurará o nginx para SSL usando /shared/ssl/ssl.crt e /shared/ssl/ssl.key. Com isso, você só precisa garantir que tenha um certificado e chave válidos nesses caminhos. Assumindo que você instalou no local padrão, o caminho para esse diretório no sistema host é /var/discourse/shared/standalone/ssl/.

Obrigado Jay e Simon, meu problema foi resolvido.

No final das contas, descobri que o certificado do Cloudflare era o culpado. Mudar para o desafio DNS via Let’s Encrypt funciona perfeitamente.

Agora tenho um pouco mais de conhecimento sobre como o Discourse funciona internamente. Legal!


Atualização: A propósito, é possível permitir que os usuários escolham como gerarão seu certificado no processo de configuração? Para novatos como eu, teremos que realmente ler e encontrar os logs para descobrir que os certificados levam à falha de conexão.

Não. A configuração foi projetada para uma maneira simples de instalar isso que (na maioria das vezes) sempre funciona. Instalar atrás de um firewall que não permite acesso da web pública é uma configuração que será difícil de dar suporte.

Fico feliz que você tenha resolvido!