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.

1 curtida

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

1 curtida

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.

1 curtida

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/.

2 curtidas

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.

2 curtidas

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!

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