У меня возникли проблемы с настройкой моего веб-сервера 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
и т.п.