У меня Apache 2.4.10 с виртуальным хостингом на основе имен SSL (SNI). Виртуальные пользователи могут использовать свой собственный сертификат и загружать его на сервер.
Все работает нормально, пока не возникнет ошибка с файлом сертификата (т.е. файл отсутствует или имеет неправильное имя).
Проблема в том, что Apache не запускается, если есть проблема с сертификатом.
Есть ли какое-то решение, как запустить Apache с этой ошибкой (т.е. все vhosts запустятся, за исключением одного виртуального хоста с ошибкой)?
Это не работает:
<If "-f '/path/to/file.crt'">
<VritualHost *:443>
SSLEngine On
SSLCertificateFile /path/to/file.crt
</VirtualHost>
</If>
... и это тоже не работает:
<VirtualHost *:443>
<If "-f '/path/to/file.crt'">
SSLEngine On
SSLCertificateFile /path/to/file.crt
</If>
</VirtualHost>
Проблема заключается в синтаксической ошибке в конфигурации «SSLEngine не разрешен здесь» или «VirtualHost здесь не разрешен». Итак, моя конфигурация выше не разрешена Apache.
Большое спасибо.
Изменить: небольшая опечатка
Я бы сказал, это работает по замыслу. SSL-сертификаты - это средство безопасности. Почему вы допускаете использование сломанных сертификатов в своей системе, которые могут поставить под угрозу весь сервер?
Как вы упомянули, что пользователи могут загружать свои сертификаты, вам необходимо реализовать функцию проверки этих сертификатов. В конце концов, функция загрузки должна проверять достоверность, правильность написания и целостность этих файлов.
Кроме того, apache поставляет средство проверки конфигурации.
$SERVER/bin/apachectl configtest
С помощью этой функции вы можете проверить свои файлы конфигурации перед перезапуском, если есть какая-либо ошибка, вам не следует перезапускать сервер.
Вместо того, чтобы пытаться запустить apache в неработающем состоянии, вам следует подумать о способе проверки SSL, которые загружаются вашими пользователями, и только если они действительны, чтобы их можно было применить в вашей конфигурации apache.
Например, если следующие два вывода MD5 совпадают, сертификат (как минимум) действителен (может быть самоподписанным, но все еще действителен):
openssl x509 –noout –modulus –in <file>.crt | openssl md5
openssl rsa –noout –modulus –in <file>.key | openssl md5