У меня есть 3 сайта, определенные в apache, site1, site2, site3. Для 1 и 2 я запросил сертификаты ssl у Let's encrypt and work OK, но НЕ для сайта 3. Проблема в том, что всякий раз, когда я получаю доступ https: // site3 Я всегда получаю сертификат с одного из других сайтов, я думаю, с первого определенного.
Это то, как должен работать apache, или моя конфигурация неверна? Не уверен, что я должен видеть, когда у меня нет определенного сертификата, возможно, какая-то ошибка «нет сертификата» ?!
/etc/httpd/conf/httpd.conf
# http site 1
<VirtualHost site1.com:80>
DocumentRoot /var/www/html/site1.com
ServerName site1.com
<Directory "/var/www/html/site1.com">
Require all granted
DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
# http site 2
<VirtualHost site2.com:80>
DocumentRoot /var/www/html/site2.com
ServerName site2.com
<Directory "/var/www/html/site2.com">
Require all granted
DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
# http site 3 (only one WITHOUT ANY SSL)
<VirtualHost site3.com:80>
DocumentRoot /var/www/html/site3.com
ServerName site3.com
<Directory "/var/www/html/site3.com">
Require all granted
DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
Include /etc/httpd/conf/httpd-le-ssl.conf >>>>>>>
/etc/httpd/conf/httpd-le-ssl.conf
# SSL site 1
<IfModule mod_ssl.c>
<VirtualHost site1.com:443>
DocumentRoot /var/www/html/site1.com
ServerName site1.com
<Directory "/var/www/html/site1.com">
Require all granted
DirectoryIndex index.html index.php
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.site1.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.site1.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site1.com/chain.pem
</VirtualHost>
</IfModule>
# SSL site 2
<IfModule mod_ssl.c>
<VirtualHost site2.com:443>
DocumentRoot /var/www/html/site2.com
ServerName site2.com
<Directory "/var/www/html/site2.com">
Require all granted
DirectoryIndex index.html index.php
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.site2.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.site2.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site2.com/chain.pem
</VirtualHost>
</IfModule>
Да, это правильно. Ваш браузер открывает соединение с сервером и запрашивает согласование TLS. Через SNI дает подсказки о том, какой сайт разыскивается. Apache не имеет настроенного сертификата для этого и «случайным образом» выбирает (фактически, выбирает первый настроенный) сертификат для подключения.
Только после того, как соединение установлено, браузер может запросить сайт.
Обратите внимание, что браузер должен сообщить пользователю, что сертификат недействителен для сайта.
Этот хакерский способ на самом деле является взломом: когда родился SSL, вам нужно было выделить один IP-адрес для каждого SSL-сайта. SNI был введен, чтобы позволить большему количеству сайтов SSL (фактически, TLS) использовать один IP-адрес. Вы можете заставить apache отказывать в соединении от клиента без SNI, но вы не можете заставить его отказаться от соединения для другого сайта.
Лучшая стратегия в этих случаях - создать «резервный» сертификат для хост-сервера с резервным сайтом и настроить его как первый (000 по умолчанию, если вы используете debian). Таким образом, посетители, запрашивающие несуществующий сайт tls, увидят предупреждающий знак, а не другой сайт.