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

Как настроить SSL с массовым виртуальным хостингом apache2 / httpd с помощью mod_vhost_alias

Я довольно долго искал, но не нашел ответов.

Я использую httpd 2.2.15 и Centos 6.2.

Я настроил apache для массового виртуального хостинга. То есть:

UseCanonicalName off
VirtualDocumentRoot /var/www/html/%0

У меня будет один и тот же «основной» домен с разными поддоменами, указывающими на виртуальные хосты. Я создал самозаверяющий сертификат для тестирования с общим именем * .mydomain.com. На весь сервер один IP.

Как я могу настроить apache для использования ssl для моих хостов?

И, если возможно, добавлено выше, я бы тоже этого хотел:

  1. Могу ли я определить каталог или некоторые файлы (например, страницу входа), которые следует исключить из ssl? Все vhosts в основном являются разными экземплярами одного и того же приложения (за исключением тех, которые я упоминаю в 2 ниже).

  2. Могу ли я определить некоторые vhosts, которые не должны использовать ssl (у меня есть полный контроль над именем поддомена для них). Это будут два приложения, моя домашняя страница (www) и какое-то административное приложение. Если невозможно сделать исключения, я думаю, я просто помещу их на другой сервер.

За исключением тех, что я упомянул в пункте 2 выше, все виртуальные хосты будут созданы автоматически по запросу пользователя.

На основе комментария @Shanes я Обновить: Если пользователь использует https: //, когда он не должен, хорошо, если он будет перенаправлен на http: //. Если это невозможно, я думаю, ничего страшного, если они получат сообщение об ошибке. Конечно, нормально, если работают ОБЕ http и https, если http работает для незащищенных файлов (на самом деле это может быть предпочтительным выбором).

Я мог найти примеры того, как это сделать, используя мод-перезапись, за исключением того, что это не было для массовых доменов (то есть использовался <VirtualHost>).

Какие уловки для этого?

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

Во-первых, вам необходимо убедиться, что ваша текущая конфигурация подготовлена ​​для добавления прослушивателя SSL. Вы не указали, используете ли вы основной сервер или <VirtualHost>, но если вы используете основной сервер, вам необходимо переключиться на <VirtualHost>.

<VirtualHost *:80>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0
    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    RewriteEngine On
    # We're going to insert some Rewrite configuration here in a minute.
</VirtualHost>

Затем мы добавим вам новый VirtualHost с SSL.

# Add this if you don't already have it:
Listen 443

<VirtualHost *:443>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0

    SSLEngine On
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/private.key

    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    # if you want to kick someone back to HTTP if they're using HTTPS,
    # do that with Rewrite configuration here.  For example:
    #RewriteRule ^/(non/sensitive/content.*\.html)$ http://%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>

Итак, это подводит нас к точке, где весь контент обслуживается как через HTTP, так и через HTTPS. Теперь, чтобы принудительно использовать HTTPS для определенных доменов, мы можем использовать mod_rewrite.

Важная информация по безопасности! Здесь нужно быть очень осторожным с точки зрения безопасности. Если вы просто перенаправляете все по HTTP на эквивалент HTTPS, вы потенциально можете «скрыть» случаи, когда запрос отправляется по HTTP вместо HTTPS из-за жестко заданных местоположений ресурсов - и если в этом запросе есть конфиденциальные данные, то это просто отправлено через Интернет в незашифрованном виде. Вам нужно будет сопоставить этот риск со своей способностью выявлять и исправлять подобные проблемы, недружелюбием пользователя к странице с ошибкой, если что-то не так, и конфиденциальностью данных.

Чтобы принудительно использовать SSL для определенных мест, вам нужно вставить конфигурацию mod_rewrite в порт 80 vhost (я прокомментировал его конфигурацию выше). Вы можете построить практически любое поведение, какое захотите, за исключением каталогов или доменов; Приведу несколько примеров:

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# Exclude the directory /images
RewriteCond %{REQUEST_URI} !^/images/
# Exclude requests to .css files
RewriteCond %{REQUEST_URI} !\.css$
# This is the more secure but less user friendly version - block requests to the non-secured port.
RewriteRule ^ - [F,L]
# This is the user friendly version, where you need to be especially careful that
# your site never sends sensitive data to http accidentally:
#RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Или, если вы хотите выполнить удобное перенаправление только для запросов к базовому каталогу и поведение при ошибке для других:

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^/$ https://%{HTTP_HOST}/ [R=301,L]

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^ - [F,L]

Если эти примеры вам не подходят, дайте мне знать.