Set up Let’s Encrypt with multiple domains / redirects

Я только что обновил это, так как старая версия больше не работала. Я протестировал это на двух сайтах, так что, думаю, всё должно быть в порядке.

3 лайка

РЕДАКТИРОВАНИЕ: Нашел решение, игнорируйте всё ниже, но оставляю это для будущих посетителей. Решение оставлено в самом низу.

Только что наткнулся на эту ветку. Итак, мой сайт: forums.mysite.me. У меня в конфигурации NGINX три домена, и у моего провайдера доменов, для которого я использую DNS CNAME, они возвращаются как небезопасные:

mysite.me
www.mysite.me
forum.mysite.me (без "s", если кто-то ошибется в написании или угадает URL)

Должен ли я использовать базовый домен в конфигурации из оригинального поста? Или как настроить это для всех трех?

after_ssl:
   # указать letsencrypt, какие дополнительные сертификаты получить
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d forums.mysite.me --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d forums.mysite.me  --fullchainpath"

Я запутался, потому что в первом разделе “replace” указано from: /--keylength/, а в следующем под ним — from: /--fullchainpath/. Так что, мне нужно сделать два таких записи для каждого из трех указанных URL или…? Или это будет выглядеть так?

after_ssl:
   # указать letsencrypt, какие дополнительные сертификаты получить
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d mysite.me -d www.mysite.me -d forum.mysite.me --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d mysite.me -d www.mysite.me -d forum.mysite.me  --fullchainpath"

^ Да, именно этот блок выше был решением для нескольких сайтов/LetsEncrypt. Очень рад.

1 лайк

Да. В файле есть две разные замены, которые необходимо обновить, указав имена хостов.

Разве пост в начале не дал вам это, когда вы ввели имена, как описано?

Как нам отредактировать первый пост (OP), чтобы это не вызывало путаницы?

1 лайк

Лично я бы перенес это над полем ввода, чтобы вы видели это во время набора текста.

В посте было сказано, что да, но я не понял этого, потому что

Почему раздел «Если вам нужно добавить несколько доменов», который я процитировал, не отвечает на этот вопрос?

1 лайк

Хорошо. Как насчёт этого:

А после кода, который нужно скопировать, следует продолжение:

Понятно ли это?

1 лайк

Я думаю, что проще всего привести в качестве примера реальный код для нескольких сайтов, который я использовал выше:

after_ssl:
   # сообщите letsencrypt, какие дополнительные сертификаты нужно получить
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d mysite.me -d www.mysite.me --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d mysite.me -d www.mysite.me --fullchainpath"

Я думаю, что большинство людей захотят добавить только один дополнительный домен, поэтому мой способ проще и предоставляет простой способ получить точный текст, который вам нужен, без необходимости вносить в него какие-либо изменения.

Возможно, всё ещё понятно, что если ваш сайт discourse.y.com и вам нужны сертификаты для discourse.y.com и y.com, вам достаточно ввести y.com в поле “domain2” и нажать на значок копирования?

В вашем примере, если вы настроили свой Discourse для mysite.com, вам не нужна часть -d mysite.me в вашем примере (или если ваш сайт www.mysite.me, вам нужна только часть -d mysite.me).

4 лайка

В какой файл добавляется этот код, пожалуйста?

1 лайк

Код следует добавить в конец вашего файла app.yml, в раздел hooks:

3 лайка

18 сообщений были перенесены в новую тему: Let’s Encrypt с несколькими доменами не работал для ECC-сертификатов

Мне всё ещё нужны две другие замены фрагментов кода или достаточно только этого нового фрагмента?

Я добавил его и перекомпилировал, но при переходе на один из доменов https, который я хочу перенаправить, всё ещё получаю ошибку конфиденциальности SSL.

При проверке сертификата его общее имя — forum.domain.com, поля O и OU в сертификат не включены.

Я пытаюсь настроить перенаправление https://domain.com и https://www.domain.com на https://forum.domain.com.

При использовании http://domain.com и http://www.domain.com перенаправление на https://forum.domain.com происходит корректно.

Что вы вставили? Как выглядит ваш блок after_ssl?

Выглядит так (реальное доменное имя изменено)

  after_ssl:
    - replace:
        filename: /etc/runit/1.d/letsencrypt
        from: /-d forum.mydomain.com /
        to: -d forum.mydomain.com -d www.mydomain.com -d mydomain.com
        global: true

Также я добавил следующее:

LETSENCRYPT_ALTERNATE_NAMES: mydomain.com,www.mydomain.com

Ошибка в браузере:

net::ERR_CERT_COMMON_NAME_INVALID

Все ли имена разрешаются? Не стоят ли они за Cloudflare? Не достигли ли вы лимитов запросов? Вы можете зайти в контейнер и выполнить /etc/runit/1.d/letsencrypt, чтобы посмотреть, что произойдёт.

Все имена разрешаются, Cloudflare не используется, показатели попадания кэша должны быть в норме.

Вот результат выполнения letsencrypt:

(Имя домена заменено)

/var/www/discourse# /etc/runit/1.d/letsencrypt
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[Tue Apr 29 04:02:13 PM UTC 2025] Unknown parameter : 4096
[Tue Apr 29 04:02:13 PM UTC 2025] Installing key to: /shared/ssl/forum.domain.com.key
[Tue Apr 29 04:02:13 PM UTC 2025] Installing full chain to: /shared/ssl/forum.domain.com.cer
[Tue Apr 29 04:02:13 PM UTC 2025] Run reload cmd: sv reload nginx
ok: run: nginx: (pid 429) 10662s
[Tue Apr 29 04:02:13 PM UTC 2025] Reload success
[Tue Apr 29 04:02:13 PM UTC 2025] Unknown parameter : ec-256
[Tue Apr 29 04:02:14 PM UTC 2025] Installing key to: /shared/ssl/forum.domain.com_ecc.key
[Tue Apr 29 04:02:14 PM UTC 2025] Installing full chain to: /shared/ssl/forum.domain.com_ecc.cer
[Tue Apr 29 04:02:14 PM UTC 2025] Run reload cmd: sv reload nginx
ok: run: nginx: (pid 429) 10663s
[Tue Apr 29 04:02:14 PM UTC 2025] Reload success

Я заглянул внутрь файла, вот забавный момент:

issue_cert() {
  LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh --issue $2 -d forum.domain.com -d www.domain.com -d domain.com--keylength $1 -w /var/www/discourse/public
}

Кажется, между последним доменом и опцией --keylength пропущен пробел?

domain.com--keylength

Исправление решило проблему, спасибо за помощь

Предполагаю, что исправление должно заключаться в добавлении / в поле to?

  after_ssl:
    - replace:
        filename: /etc/runit/1.d/letsencrypt
        from: /-d forum.domain.com /
        to: "-d forum.domain.com -d www.domain.com "
        global: true

Должны быть кавычки, а не слеши. Я отредактировал ваш пост и пост автора темы. То, что у вас сейчас, должно работать.