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.

Спасибо.

Вы правы.

Вы должны были получить предупреждение от Discourse-setup о том, что подключение не удалось.

Это не поддерживается. Если вы хотите запустить сервер за брандмауэром, вам нужно найти другой способ получения сертификата. Возможно, вам поможет статья Разрешить SSL / HTTPS для вашей настройки Discourse Docker

Привет @pfaffman, большое спасибо за информацию! Следуя инструкциям из того поста, страница приветствия Discourse наконец-то появилась.

Осталась лишь одна небольшая проблема: я использую Cloudflare для получения сертификата для исходного сервера. Но при попытке открыть страницу в браузере появляется предупреждение NET::ERR_CERT_AUTHORITY_INVALID (хотя я могу продолжить, проигнорировав его, но мои пользователи, вероятно, не захотят этого делать).

Интересует, связана ли эта проблема с Discourse, и хочу узнать методы отладки этого вопроса. Спасибо.

Кроме того, поскольку sshd.template.yml устарел, мне приходится вручную редактировать /etc/nginx/conf.d/discourse..conf, чтобы изменить ssl_certificate и ssl_certificate_key, указав их на /shared/ssl/ssh.crt и /shared/ssl/ssh.key (значение по умолчанию — /shared/ssl/<domain name>.cer). В противном случае nginx не будет работать из-за проблем с сертификатами, выдавая ошибку вроде:

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

Я думаю, что именно это может стать причиной проблем.

Вам не нужен шаблон sshd, и ссылку на него следует удалить.

Вам нужно лишь изменить остальные рекомендованные строки, чтобы в конфигурацию nginx были внесены правильные данные.

Если вы получаете ошибку о недействительном сертификате, то проблема, скорее всего, именно в этом. Вам потребуется действительный сертификат.

Вам достаточно использовать шаблон 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"

Это настроит nginx для работы с SSL, используя /shared/ssl/ssl.crt и /shared/ssl/ssl.key. При этом вам нужно лишь убедиться, что по этим путям находятся действительный сертификат и ключ. Предполагая, что установка выполнена в стандартное расположение, путь к этой директории на хост-системе — /var/discourse/shared/standalone/ssl/.

Спасибо, Джей и Саймон, моя проблема решена.

В конце концов я выяснил, что дело в сертификате Cloudflare. Переключение на DNS-вызов через Let’s Encrypt работает безупречно.

Теперь я немного больше знаю о том, как работает Discourse «под капотом». Круто!


Обновление: Кстати, возможно ли разрешить пользователям выбирать способ генерации сертификата в процессе настройки? Для новичков, таких как я, приходится читать логи и искать их, чтобы понять, что именно сертификаты приводят к сбоям соединения.

Нет. Настройка разработана для одного простого способа установки, который (почти) всегда работает. Установка за брандмауэром, который не допускает доступ из публичного интернета, — это конфигурация, которую будет сложно поддерживать.

Рады, что вы смогли решить проблему!