ファイアウォールの背後にあるIPでLet's Encryptが失敗しています

皆さん、こんにちは。

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 が自動的に証明書を生成しようとし、リストされた URL を介して HTTP モードで検証しようとしているためだと推測します。しかし、私の IP は機関のファイアウォール下にあり、外部 IP からのアクセスを許可できないため、CA も同様です。

Let’s Encrypt のウェブサイト から、HTTP が利用できない場合は DNS チャレンジを使用できることも学びましたが、Discourse でこれをどのように行うかについては確信がありません。

よろしくお願いします。

「いいね!」 1

その通りです。

Discourse-setup から接続できなかったという警告が表示されたはずです。

サポートされていません。ファイアウォールの内側で実行したい場合は、証明書を取得するための別の方法を見つける必要があります。Discourse Docker セットアップで SSL / HTTPS を許可する を参照してください。

「いいね!」 1

こんにちは、@pfaffman さん、情報提供ありがとうございます!その投稿の指示に従ったところ、Discourse のウェルカムページが表示されるようになりました。

残るは 1 つの軽微な問題だけです。オリジンサーバー用の証明書を生成するために 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) を追加したい場合は、これらの2行のコメントを解除してください
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

最初の行のコメントを解除するだけです。

  ## Lets Encrypt (https) を追加したい場合は、これらの2行のコメントを解除してください
  - "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

これにより、nginx が SSL 用に /shared/ssl/ssl.crt および /shared/ssl/ssl.key を使用するように設定されます。これにより、これらのパスに有効な証明書とキーがあることを確認するだけで済みます。標準の場所にインストールしたと仮定すると、ホストシステム上のそのディレクトリへのパスは /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.