Let's Encrypt 在防火墙后的 IP 出现问题

大家好,

安装 Discourse 后,我收到 HTTP 502 错误,日志显示:

$ 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)

我猜想这是因为 Discourse 尝试自动生成证书,并通过 HTTP 模式进行验证,访问了列出的 URL。但是,我的 IP 位于机构防火墙之下,因此不允许外部 IP 访问,CA 也同样如此。

我还从 Let’s Encrypt 的网站了解到,如果 HTTP 不可用,可以使用 DNS 挑战,但我不知道如何在 Discourse 中执行此操作。

谢谢。

1 个赞

你说得对。

你应该会收到来自 Discourse-setup 的警告,提示它无法连接。

不支持。如果你想在防火墙后面运行,你需要找到其他方法来获取证书。你可能需要查看 为你的 Discourse Docker 设置允许 SSL / HTTPS

1 个赞

您好 @pfaffman ,非常感谢您的信息!按照该帖子中的说明,Discourse 的欢迎页面终于显示出来了。

只剩下一个小问题:我使用 cloudflare 为源服务器生成证书。但是,当我尝试从浏览器访问页面时,它会显示 NET::ERR_CERT_AUTHORITY_INVALID 警告(尽管我可以忽略它继续访问,但我的用户可能不希望这样)。

我想知道这个问题是否与 Discourse 有关,并想了解实际调试此问题的具体方法。谢谢。

另外,由于 sshd.template.yml 已弃用,我必须手动编辑 /etc/nginx/conf.d/discourse..conf 以将 ssl_certificatessl_certificate_key 修改为指向 /shared/ssl/ssh.crt/shared/ssl/ssh.key(默认值为 /shared/ssl/<域名>.cer),否则 nginx 将因证书问题无法工作,并报错如下:

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

我正在考虑这是否是导致问题的关键点。

您不需要 sshd 模板,应该删除对它的引用。

您只需修改其他推荐的行,将正确的信息放入 nginx 配置中。

如果您收到证书无效的错误,那很可能就是问题所在。您需要一个有效的证书。

1 个赞

您只需要使用 web.ssl 模板(而不是 web.letsencrypt.ssl 模板)。示例 yml 包含以下行:

  ## 如果您希望添加 Lets Encrypt (https),请取消注释这两行
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

只需取消注释第一个:

  ## 如果您希望添加 Lets Encrypt (https),请取消注释这两行
  - "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

这将使用 /shared/ssl/ssl.crt/shared/ssl/ssl.key 设置 nginx 以进行 SSL。这样,您只需要确保在这些路径下有一个有效的证书和密钥。假设您已安装到标准位置,主机系统上该目录的路径为 /var/discourse/shared/standalone/ssl/

2 个赞

感谢 Jay 和 Simon,我的问题已解决。

归根结底,我发现是 Cloudflare 的证书出了问题。切换到 Let’s Encrypt 的 DNS 挑战模式效果非常好。

现在我对 Discourse 的内部工作原理有了更多的了解。太棒了!


更新:顺便问一下,是否可以在设置过程中允许用户选择他们将如何生成证书?对于像我这样的新手来说,我们必须实际阅读并查找日志才能发现证书导致连接失败。

2 个赞

不可以。此设置旨在提供一种简单且(通常)始终有效的方法来安装。安装在不允许公共网络访问的防火墙后面将难以获得支持。

很高兴您已解决!

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