Назад | Перейти на главную страницу

Лучший способ установить несколько SSL-доменов с перенаправлением

Интересно, какой "лучший" и рекомендуемый метод настройки доменов SSL на одном IP-адресе, где есть перенаправления с: 80 на: 443. Это не было полностью рассмотрено здесь, потому что мне нужны эти перенаправления (https://httpd.apache.org/docs/2.4/vhosts/name-based.html)

Домены определены в DNS, и все перенаправляются на один и тот же IP-адрес:

У меня много проблем с настройкой так, чтобы они были на одном IP-адресе. Идея состоит в том, чтобы сначала определить обычные: 80 виртуальных серверов, которые перехватывают протокол http: // и перенаправляют на https: //. Тогда правильная конфигурация в целом определяется в *: 443 как виртуальный хост на основе имени. Однако я хотел бы иметь какой-то фиктивный виртуальный хост по умолчанию, который будет иметь пустую страницу в собственном обычном корневом документе, и только когда запрос относится к определенному домену (например, в set1 или set2), должен быть загружен весь виртуальный хост для определенного домена . Я решил не использовать Rewrites, потому что для такой задачи рекомендуются простые редиректы. Использование переадресации сработало только в моем случае для одного домена.

Моя установка следующая:

<Virtualhost *:80>
    ServerName example1.com
    Redirect / https://example1.com
</Virtualhost>
<Virtualhost *:80>
    ServerName example1.org
    Redirect / https://example1.org
</Virtualhost>
<VirtualHost *:443>
    ServerName example1.com
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example1.org
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example2.com
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example2.info
    DocumentRoot .......
    .......
</VirtualHost>

Одна из проблем с этой настройкой заключается в том, что она не работает. Другая проблема в том, что это повторяется много раз. Думаю, мне нужно настроить что-то вроде этого (psedoconfig):

dummy configuration, catch for example pure IP requests, etc.

<Virtualdomain для example1.com и .org>, если запрашивается http, перенаправьте на https и для обоих доменов определите одну и ту же настройку, определенную корневым каталогом документа, все журналы и сертификаты для этих доменов и т. Д.

<AnotherVirtual, например, example2 .com и .info> здесь снова - если запрашивается http, перейдите в общий каталог документов https, журналы и т. Д.

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

РЕДАКТИРОВАТЬ: ОК, теперь конфигурация проверена, и я уверен, что знаю, что у меня есть. И, к сожалению, не работает.

Я выпустил сертификаты SSL для каждого сайта, использующего acme.sh, набрав (домены изменены из-за конфиденциальности):

acme.sh --issue -d www.AAA.com -d AAA.com -d www.AAA.info -d AAA.info -w /home/path/aaa/www
cd /home/path/aaa/etc
acme.sh --install-cert -d www.AAA.com -d AAA.com -d www.AAA.info -d AAA.info --cert-file cert.pem --key-file priv.pem --fullchain-file fullchain.pem

Это сработало хорошо, но apache conf имеет ТОЛЬКО этот единственный домен, настроенный на vhost, а в ssl-части были некоторые поддельные / старые сертификаты, позволяющие запускать Apache. Сертификат был протестирован, и страница была загружена в браузер с использованием http://AAA.com адрес, который был правильно перенаправлен на https://AAA.com, что тоже сработало.

Затем я перенастроил apache для поддержки домена PPP.com, используя аналогичную процедуру. Это также сработало, когда я настроил apache только для одного домена. Теперь объединение этих двух конфигураций НЕ РАБОТАЕТ, потому что PPP.com распознается, поскольку он имеет сертификат AAA.com, что вызывает ошибку NET :: ERR_CERT_COMMON_NAME_INVALID

Итак, я застрял. Вот моя конфигурация apache для виртуальных хостов: https://pastebin.com/hK3g6K3m

Часть, включенная как common.cfg, содержит только стандартные параметры SSL и конфигурацию доступа к каталогу, конфигурацию журналов и т. Д.

Делая ssl, вы должны учитывать свои сертификаты. Например, если у вас есть один сертификат для example1.com и example1.org, вы можете просто создать один VirtualHost с директором ServerName и вторичный (или более) ServerAlias. Если у вас есть независимые сертификаты для каждого домена, вам нужно разделить все на свои VirtualHost поскольку у вас не может быть нескольких сертификатов на одном уровне.

Кроме того, в версиях до 2.4 NameVirtualHost *:443 является обязательное до любого VirtualHost чтобы apache выполнял часть SNI, то есть показывал запрашиваемый вами сертификат, а не сертификат по умолчанию.

По умолчанию https будет первым VirtualHost *:443 вы определяете, поэтому просто перемещайте их, как вам нужно.

Что касается http-части, если все будет перенаправлено на https-версию самого себя (ничто не обслуживается http), вы можете создать один VirtualHost *:80 со всеми ServerAlias необходимо (не обязательно, но уточнить) и использовать сингл RewriteRule Такие как:

RewriteRule "^/?(.*)"        "https://%{HTTP_HOST}/%1" [L,R,NE]

Я не тестировал, но это должен работай.

ПРИМЕЧАНИЕ: я не использую Redirect потому что я не знаю, допускает ли он переменную окружения в части замены, но вы также можете попробовать это.

Я не пробовал себя, чего вы хотите достичь, но если бы я попробовал, я бы сделал это так:

  1. используйте постоянное перенаправление для перенаправления всего HTTP-трафика на его аналоги HTTPS (как вы это сделали)
  2. используйте rewriterule во всех «вторичных» виртуальных хостах, чтобы переписать запросы, отправляемые на «первичный» виртуальный хост, на котором вы принимаете запрос и отвечаете на них (это также сохранит URL-адрес вторичного виртуального хоста для посетителя вашего интернет сайт)
  3. используйте include, чтобы избежать повторения: поместите все, что может быть общим для этих виртуальных хостов (например, директивы кеша, SSL и т. д.), в один или несколько текстовых файлов, которые вы затем включаете в определения виртуального хоста.