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

виртуальные хосты apache2 для # поддоменов с перезаписью на SSL

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

Моя установка производит этот вывод, и поэтому мой синтаксис конфигурации должен быть в порядке:

# apache2ctl -t -D DUMP_VHOSTS
VirtualHost configuration:
192.168.0.1:80         is a NameVirtualHost
default server cal.example.com (/etc/apache2/sites-enabled/99-davical:2)
port 80 namevhost cal.example.com (/etc/apache2/sites-enabled/99-davical:2)
port 80 namevhost proius.example.com (/etc/apache2/sites-enabled/proius:1)
port 80 namevhost slnew.example.com (/etc/apache2/sites-enabled/slnew:1)
port 80 namevhost webmail.example.com (/etc/apache2/sites-enabled/webmail:1)
192.168.0.1:443        is a NameVirtualHost
default server proius.example.com (/etc/apache2/sites-enabled/proius:10)
port 443 namevhost proius.example.com (/etc/apache2/sites-enabled/proius:10)
port 443 namevhost slnew.example.com (/etc/apache2/sites-enabled/slnew:10)
port 443 namevhost webmail.example.com (/etc/apache2/sites-enabled/webmail:10)
192.168.0.1:8443       is a NameVirtualHost
default server cal.example.com (/etc/apache2/sites-enabled/99-davical:11)
port 8443 namevhost cal.example.com (/etc/apache2/sites-enabled/99-davical:11)
Syntax OK

Вот как определяются все мои виртуальные хосты:

<VirtualHost slnew.example.com:80>
 ServerName      slnew.example.com
 ServerAdmin     vvh@example.com
 DocumentRoot    /var/www/slnew
 RewriteEngine   On
 RewriteLogLevel 0
 RewriteRule     ^/(.*) https://slnew.example.com:443/$1 [L,R]
</VirtualHost>
<VirtualHost slnew.example.com:443>
 ServerName      slnew.example.com
 ServerAdmin     vvh@example.com
 DocumentRoot /var/www/slnew
 <Directory /var/www/slnew>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
 </Directory>
 LogLevel info
 ErrorLog ${APACHE_LOG_DIR}/slnew_error.log
 CustomLog ${APACHE_LOG_DIR}/slnew_access.log combined
 SSLEngine               on
 SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
 SSLProtocol             -all +SSLv3 +TLSv1
 SSLCipherSuite          SSLv3:+HIGH:+MEDIUM
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
  SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
  SSLOptions +StdEnvVars
 </Directory>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

Когда я захожу на свои сайты, я получаю в Google Chrome такую ​​ошибку:

Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.

Вы не можете запустить несколько виртуальных хостов на основе имен SSL на одной и той же комбинации IP: порт.

Apache не может узнать, какой из них вам нужен, поскольку заголовок Host: не отправляется до тех пор, пока не будет установлен безопасный канал, а для установления безопасного канала apache должен выбрать сертификат для использования. Это проблема курицы и яйца.

Но помимо этого вы пытаетесь получить доступ к HTTP-контенту через SSL-соединение, что вызывает ошибку, о которой вы сообщили. Это другая проблема, чем у сертификата.

Правило №0: НИКОГДА не используйте имена хостов в определении виртуального хоста. Когда-либо.

Правило №1: НЕ используйте перезапись, когда подойдет что-нибудь еще.

В случае перенаправления HTTP на HTTPS вы создаете столько виртуальных хостов HTTP (порт 80), сколько у вас есть виртуальных хостов SSL, а затем перенаправляете на версию SSL для каждого из них.

Кажется, вы реализовали 80% этого, а затем сдались и подумали, что использование перезаписи было правильным решением :)

Вместо этого замените ВСЕ вышеперечисленное на:

<VirtualHost *:80>
  ServerName slnew.example.com
  Redirect Permanent / https://slnew.example.com/
</Virtualhost>

Теперь часть SSL, по крайней мере, перестанет вызывать ошибки, но вы получите предупреждение о сертификате для каждого виртуального хоста SSL, который не является каноническим CN для выбранного сертификата (apache всегда будет выбирать сертификат, определенный в первый SSL vhost.)

Если вы действительно хотите, чтобы это работало правильно, у каждого виртуального хоста должен быть свой IP-адрес, который вы используете в определении Virtualhost:

<Virtualhost 55.66.77.88:443>
  ServerName slnew.example.com

и т.п.