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

Применить сертификат SSL в более широком контексте

В моем по умолчанию-ssl

 <VirtualHost _default_:443>
  ServerName example.co
  DocumentRoot /var/www/html/example
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName example2.co
  DocumentRoot /var/www/html/example2
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerAlias subdomain1.*
  DocumentRoot /var/www/html/example/subdomain1
 </VirtualHost>
 <VirtualHost *:443>
  ServerAlias subdomain2.*
  DocumentRoot /var/www/html/example/subdomain2
 </VirtualHost>

Я хотел бы применить сертификат SSL к домену, но применить корень документа к разным поддоменам.

По какой-то причине

https://subdomain1.example.co/test is SECURE
https://subdomain1.example2.co/test is NOT SECURE

У меня есть подстановочный SSL-сертификат для обоих.

Оба должны работать.

Почему я могу без проблем назначить SSL для всех example.co и его поддоменов? Но я не могу сделать то же самое с example2.co?

Я стараюсь избегать написания большого количества кода, потому что все довольно логично. Есть более короткий способ сделать это (мое единственное решение):

 <VirtualHost *:443>
  ServerName example.co
  DocumentRoot /var/www/html/example
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName example2.co
  DocumentRoot /var/www/html/example2
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName subdomain1.example.co
  DocumentRoot /var/www/html/example/subdomain1
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName subdomain1.example2.co
  DocumentRoot /var/www/html/example2/subdomain1
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName subdomain2.example.co
  DocumentRoot /var/www/html/example/subdomain2
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName subdomain2.example2.co
  DocumentRoot /var/www/html/example2/subdomain2
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost> 

Это должно работать с VirtualDocumentRoot:

 <VirtualHost *:443>
  ServerName example.co
  DocumentRoot /var/www/html/example
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerName example2.co
  DocumentRoot /var/www/html/example2
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerAlias *.example.co
  VirtualDocumentRoot /var/www/html/example/%-3
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
 </VirtualHost>
 <VirtualHost *:443>
  ServerAlias *.example2.co
  VirtualDocumentRoot /var/www/html/example2/%-3
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
 </VirtualHost>

В этой конфигурации для каждого поддомена корень документа устанавливается динамически. В %-3 берет третью часть (считая справа) запрошенного домена и добавляет ее к пути. Например sub1.example.co приведет к /var/www/html/example/sub1 и abcd.example2.co приведет к /var/www/html/example/abcd. Если вы добавите субдомен, например sub123.example.co вам даже не нужно трогать этот конфиг, потому что путь для этого поддомена устанавливается динамически :)

Дополнительная информация: есть тонкие различия между ServerName и ServerAlias:

ServerName также может принимать номера портов, а ServerAlias ​​- нет.

ServerAlias может принимать подстановочные знаки (например, * .mywebsite.com), а ServerName - нет.

Вот почему вы должны использовать ServerAlias ​​вместо ServerName для поддоменов с подстановочными знаками. Я не знаю, работает ли ServerAlias ​​без ServerName. Если не просто добавить строку ServerName со случайным именем поддомена, например. any.example.co к двум поддоменам с подстановочными знаками vhosts;)


Ссылка на пост, где я получил начальную информацию об этом: https://stackoverflow.com/questions/13566226/creating-wildcard-sub-domain-using-apache-virtualhost

Ссылка на документы apache2 об этом: https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html