Цели:
Я проверил все 3 цели, и все работает нормально.
Вопросы:
Код содержит только важные части.
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
show error page
</VirtualHost>
<VirtualHost *:443>
SSLCertificateFile san.crt
CustomLog san-access.log
ProxyPass / http://my-local-url-server/
ProxyPassReverse / http://my-local-url-server/
</VirtualHost>
<VirtualHost *:443>
ServerName myurl1.server.com
SSLCertificateFile myurl1.crt
CustomLog myurl1-access.log
ProxyPass / http://mybackend1/
ProxyPassReverse / http://mybackend1/
</VirtualHost>
<VirtualHost *:443>
ServerName myurl2.server.com
SSLCertificateFile myurl2.crt
CustomLog myurl2-access.log
ProxyPass / http://mybackend2/
ProxyPassReverse / http://mybackend2/
</VirtualHost>
Путаница здесь возникает между согласованием SSL и обработкой виртуального хоста apache. Вот что происходит:
Если пользователь подключается без поддержки SNI, Apache не может сначала узнать, какой виртуальный хост хочет пользователь, поскольку имя хоста скрыто в шифровании SSL. Таким образом, apache будет использовать первый найденный SSL-сертификат для согласования SSL. После того, как клиент принял этот сертификат и завершил согласование, Apache сможет расшифровать запрос и обработать его так же, как если бы клиент поддерживал SNI с самого начала.
Таким образом, к серверу SAN никогда не поступает никаких HTTP-запросов - есть только согласование SSL, которое использует сертификат с сервера SAN, прежде чем выяснять, какой vhost использовать для HTTP-запроса. Apache регистрирует только HTTP-запросы, но не переговоры SSL.