Apache2: SSL или TLS и Virtual Hosts - несколько сайтов (хостов) на одном ip
Встал у меня серьёзный вопрос безопастности. Понадобилось обеспечить доступ к своим ресурсам по SSL или TLS протоколу для безопастности. Т.к. у меня всего один IP адрес, а веб ресурсов лежит несколько, то как оказалось эта задача не решается тривиально.
По умолчанию доступен по SSL лишь localhost, который доступен из вен по домену example.com. Мне поналобилось сделать доступным по httpS поддомен (виртуальный хост или Apache virtual host) по адрсеу test.example.com.
В этом мне сильно помгла вот эта статья на Gentoo wiki. Нет смысла тут её переписывать, чуть ниже выложу её архив на всякий пожарный и то, какие настройки я подправил у себя в соответствии со статьёй.
Правка конфигурационных файлов
Для начала надо добавить вот такую строчку в /etc/apache2/vhosts.d/00_default_ssl_vhost.conf (почти в самый конец):
</IfModule>
</VirtualHost>
Include /etc/apache2/vhosts.d/*.ssl-conf
</IfModule>
</IfDefine>
</IfDefine>
Затем в папке /etc/apache2/vhosts.d/ при добавлении нового виртуального хоста доступного только по безопастному протоколу SSL 3.0 или TLS 1.0 необходимо создать файл с его именем, куда внести по аналогии следующие данные:
<VirtualHost *:443>
#Server name - Domain Name
ServerName test.example.com
#Root folder of server
DocumentRoot "/var/www/test/htdocs"
#CGI location (root)
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/test/cgi-bin/"
</IfModule>
#enable SSL
SSLEngine on
#This forces forbidden access when SSLRequireSSL or SSLRequire successfully decided that access should be forbidden
SSLOptions StrictRequire
# enable SSLv3 and TLSv1, but not SSLv2
SSLProtocol all -SSLv2
#The following enables only the seven strongest ciphers (http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html):
SSLCipherSuite HIGH:MEDIUM
#Sertificates path
SSLCertificateFile /etc/ssl/apache2/test/server.crt
SSLCertificateKeyFile /etc/ssl/apache2/test/server.key
#When this option is enabled, the standard set of SSL related CGI/SSI environment variables are created.
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
#rules for CGI dir
<Directory "/var/www/test/cgi-bin">
SSLOptions +StdEnvVars
SSLRequireSSL
AllowOverride All
Options ExecCGI
<IfModule mod_access.c>
Order allow,deny
Allow from all
</IfModule>
</Directory>
#Rules for scripts root folder
<Directory "/var/www/test/htdocs">
SSLRequireSSL
Options -Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<IfModule setenvif_module>
BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</IfModule>
#LOGGIN
ErrorLog /var/log/apache2/ssl_error_log
<IfModule log_config_module>
TransferLog /var/log/apache2/ssl_access_log
</IfModule>
## Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a compact
# non-error SSL logfile on a virtual host basis.
<IfModule log_config_module>
CustomLog /var/log/apache2/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</IfModule>
#Other Stuff
<IfModule peruser.c>
ServerEnvironment apache apache
MinSpareProcessors 4
MaxProcessors 20
</IfModule>
<IfModule itk.c>
AssignUserID apache apache
MaxClientsVHost 50
</IfModule>
</VirtualHost>