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

Проблемы Apache SNI с сертификатами SSL

У меня проблемы с конфигурациями VirtualHost на моем сервере. На моем сервере работает Ubuntu 14.04.5 LTS (GNU / Linux 4.4.0-31-generic x86_64) с Apache / 2.4.7 (Ubuntu).

Я много читал об Apache и SNI из других тем здесь, но не смог решить свою конкретную проблему.

У меня есть несколько VirtualHosts, настроенных из разных доменов, каждый со своими собственными сертификатами SSL, например:

<VirtualHost *:80>
  ServerAdmin admin@mydomain.com
  ServerName mydomain.com
  ServerAlias www.mydomain.com
  DocumentRoot /home/user/mydomain.com/public_html
  ErrorLog /home/user/mydomain.com/logs/error.log
  CustomLog /home/user/mydomain.com/logs/access.log combined
</VirtualHost>

<VirtualHost *:443>
  ServerAdmin admin@mydomain.com
  ServerName mydomain.com
  ServerAlias www.mydomain.com
  DocumentRoot /home/user/mydomain.com/public_html
  ErrorLog /home/user/mydomain.com/logs/error.log
  CustomLog /home/user/mydomain.com/logs/access.log combined
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/mydomain.com.crt
  SSLCertificateKeyFile /etc/apache2/ssl/mydomain.com.key
  SSLCACertificateFile /etc/apache2/ssl/mydomain.com.root.crt
  SSLCertificateChainFile /etc/apache2/ssl/mydomain.com.chain.crt
</VirtualHost>

<VirtualHost *:80>
  ServerAdmin admin@otherdomain.com
  ServerName otherdomain.com
  ServerAlias www.otherdomain.com
  DocumentRoot /home/user/otherdomain.com/public_html
  ErrorLog /home/user/otherdomain.com/logs/error.log
  CustomLog /home/user/otherdomain.com/logs/access.log combined
</VirtualHost>

<VirtualHost *:443>
  ServerAdmin admin@otherdomain.com
  ServerName otherdomain.com
  ServerAlias www.otherdomain.com
  DocumentRoot /home/user/otherdomain.com/public_html
  ErrorLog /home/user/otherdomain.com/logs/error.log
  CustomLog /home/user/otherdomain.com/logs/access.log combined
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/otherdomain.com.crt
  SSLCertificateKeyFile /etc/apache2/ssl/otherdomain.com.key
  SSLCACertificateFile /etc/apache2/ssl/otherdomain.com.root.crt
  SSLCertificateChainFile /etc/apache2/ssl/otherdomain.com.chain.crt
</VirtualHost>

В большинстве случаев это нормально работает для большинства браузеров, однако время от времени на определенных устройствах или в случайное время, когда я пытаюсь перейти на «otherdomain.com», он пытается получить сертификат SSL для «mydomain.com» , что приводит к ошибке фишинга / неверного сертификата.

Я читал, что SNI может быть решением, поэтому я добавил в свою конфигурацию Apache следующее:

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Однако также кажется, что в моей версии Apache (2.4) эта функция была прекращена, что подтверждается всякий раз, когда я перезапускаю Apache:

# service apache2 restart
* Restarting web server apache2                                                                                                                                              
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:17

Это также не помогло устранить проблему, я все еще получаю эту ошибку. Я могу воспроизводить эту проблему каждый раз, используя старый BlackBerry.

За исключением необходимости получать уникальный IP-адрес для каждого VirtualHost с использованием SSL, каковы мои варианты решения этой проблемы?

Также в моем примере показано только 2 домена, однако на самом деле у меня есть 5 доменов с собственными сертификатами SSL. Все они получают сертификат SSL первого домена, когда я могу воспроизвести проблему.

Очень ценю любую помощь.

Виртуальные хосты на основе имен не прекращаются. В NameVirtualHost параметр удаляется, потому что он избыточен. Остальная часть конфигурации будет содержать достаточно информации, чтобы Apache знал, нужно ли включать этот параметр или нет.

Кроме того, SNI - это не параметр, который можно включить или выключить на стороне сервера. Либо клиент поддерживает его и отправляет поле SNI в самом первом сообщении, отправленном на сервер, либо клиент не поддерживает его, и сервер ничего не может с этим поделать.

Ваши варианты:

  • Получите отдельный IP-адрес для каждого домена.
  • Обновите клиенты, которые еще не поддерживают SNI, для использования новейшего программного обеспечения.
  • Получите единый сертификат, охватывающий все домены.
  • Примите тот факт, что только первый домен будет работать для всех клиентов, а остальные домены будут отключены для меньшинства клиентов, использующих устаревшее программное обеспечение.