Я довольно долго искал, но не нашел ответов.
Я использую httpd 2.2.15 и Centos 6.2.
Я настроил apache для массового виртуального хостинга. То есть:
UseCanonicalName off
VirtualDocumentRoot /var/www/html/%0
У меня будет один и тот же «основной» домен с разными поддоменами, указывающими на виртуальные хосты. Я создал самозаверяющий сертификат для тестирования с общим именем * .mydomain.com. На весь сервер один IP.
Как я могу настроить apache для использования ssl для моих хостов?
И, если возможно, добавлено выше, я бы тоже этого хотел:
Могу ли я определить каталог или некоторые файлы (например, страницу входа), которые следует исключить из ssl? Все vhosts в основном являются разными экземплярами одного и того же приложения (за исключением тех, которые я упоминаю в 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]
Если эти примеры вам не подходят, дайте мне знать.