У меня есть сервер, на котором настроены два сертификата SSL, один для внутреннего доступа, где к нему обращаются по строкам host.my-local.net
и другие для внешнего доступа, где он доступен аналогично 185.185.185.185
(это не фактический IP-адрес, но это IP-адрес, поскольку ему не присвоено имя хоста). При доступе через внешний адрес соединение проходит через балансировщик нагрузки / брандмауэр, к которому у меня нет доступа, все, что я знаю, это то, что он переводит входящие соединения на определенном порту во внутренний адрес на порту SSL.
Проблема в том, что при внешнем подключении я получаю предупреждение браузера о том, что сайт маскируется под host.my-local.net
; он представляет сертификат на host.my-local.net
вместо того 185.185.185.185
. У меня есть виртуальный хост, настроенный для обоих имен в моем конфигурационном файле apache2, поэтому я предполагаю, что по какой-то причине у сервера возникли проблемы с различением внешнего соединения и соединения LAN. У меня не было этой проблемы с простым NAT, поэтому я не знаю, почему это будет иметь значение, если балансировщик нагрузки делает запрос так, как будто он поступает из локальной сети, а не изнутри.
Я убедился, что используемый мной браузер поддерживает SNI (Google Chrome), а Apache 2.4, по-видимому, поддерживает его из коробки, не требуя директивы NameVirtualHost. Однако в документации говорится:
In 2.3.11 and later, any time an IP address and port combination is used in
multiple virtual hosts, name-based virtual hosting is automatically enabled
for that address.
Однако это не тот же IP-адрес, который используется на двух разных виртуальных хостах: один - это внутренний (LAN) IP-адрес, а другой - внешний (видимый всем) IP-адрес, применимо ли это здесь?
Чтобы прояснить мою конфигурацию, у меня настроены два виртуальных хоста, например:
<VirtualHost 185.185.185.185:443>
# here i specify the certificate for 185.185.185.185, e.g.
SSLCertificateFile /etc/ssl/private/185.185.185.185.crt
</VirtualHost>
<VirtualHost host.my-local.net:443>
# here i specify the certificate for host.my-local.net, e.g.
SSLCertificateFile /etc/ssl/private/host.my-local.net.crt
</VirtualHost>
Благодаря комментарию @ShaneMadden я смог понять это.
Эта проблема заключается в том, что мне нужно, чтобы оба VirtualHosts указывали один и тот же IP-адрес с использованием подстановочного знака. Итак, моя конфигурация должна выглядеть так:
<VirtualHost *:443>
# here i specify the certificate for 185.185.185.185, e.g.
SSLCertificateFile /etc/ssl/private/185.185.185.185.crt
ServerName 185.185.185.185
</VirtualHost>
<VirtualHost *:443>
# here i specify the certificate for host.my-local.net, e.g.
SSLCertificateFile /etc/ssl/private/host.my-local.net.crt
ServerName host.my-local.net
</VirtualHost>