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

Как мне условно установить SSLCertificateFile, если файл существует?

Я использую Let's Encrypt (certonly) для создания сертификатов SSL для нескольких веб-сайтов, размещенных на сервере Apache. Расположение файлов этих сертификатов определяется до их создания, поэтому я заранее записываю их пути в конфигурацию моего виртуального хоста. Когда сайт заработает, я буду использовать certbot чтобы получить файлы сертификата, а затем перезагрузите конфигурацию Apache.

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

Проблема, с которой я столкнулся, заключается в том, что Apache не будет работать без всех файлов сертификатов, несмотря на наличие глобального отката. Я пытался условно настроить сертификат Let's Encrypt, только если файл существует, используя IF, но Apache говорит SSLCertificateFile not allowed here.

Как я могу отменить глобальный SSLCertificateFile только когда существуют новые файлы сертификатов? Я пытаюсь сделать все это без изменения конфигурации до и после создания сертификатов.

Вот что я пробовал:

<If "-f '/etc/letsencrypt/live/domain/fullchain.pem'">
  SSLCertificateFile /etc/letsencrypt/live/domain/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem
</If>

SSLCertificateFile not allowed here

В этом случае я бы создал каталог символических ссылок для каждого домена и использовал бы сертификат snakeoil сервера (или ваш ранее упомянутый «глобальный» сертификат) для доменов, которые вы еще не настроили. Например:

$ ls -1 /etc/ssl/domains
example.com/fullchain.pem -> /etc/letsencrypt/live/example.com/fullchain.pem
example.com/privkey.pem -> /etc/letsencrypt/live/example.com/privkey.pem
second-example.com/fullchain.pem -> /etc/ssl/certs/ssl-cert-snakeoil.pem
second-example.com/privkey.pem -> /etc/ssl/private/ssl-cert-snakeoil.key

Затем вы можете установить директивы Apache для использования каталога символических ссылок:

SSLCertificateFile /etc/ssl/domains/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/domains/example.com/privkey.pem

Преимущество этого состоит в том, что при создании сертификата Let's Encrypt для домена требуется только заменить символическую ссылку, однако пользователи, посещающие домен до установки полного сертификата, получат предупреждения, поскольку сертификат snakeoil является самоподписанным.

На самом деле у меня есть хорошо известный псевдоним в одном каталоге для всех виртуальных хостов. Таким образом, задача становится доступной через виртуальный хост по умолчанию, когда новый виртуальный хост не включен.

Еще одна идея: если я правильно понял, у вас есть глобальный виртуальный хост в качестве общего, а затем другие виртуальные хосты, по одному на веб-сайт. Если у веб-сайта еще нет связанного SSL-сертификата, его вообще не следует настраивать. Вы можете поместить каждую конфигурацию веб-сайта в отдельный файл и иметь 2 каталога: sites-enabled и sites-waiting с конфигурацией Apache, говорящей о включении всего от sites-enabled. Когда ваш веб-сайт настроен (то есть у него есть сертификат SSL), вам просто нужно переместить его конфигурацию из одного каталога в другой и перезагрузить Apache.

Такая установка выполняется различными дистрибутивами Linux.