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

Обновление Debian Squeeze нарушает работу Apache SSL

Я обновил свой Debian с Lenny до Squeeze. БОЛЬШАЯ ОШИБКА.

Теперь я получаю:

[Tue Feb 08 16:34:57 2011] [error] Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)

завален повсюду /var/log/apache2/error.log.

Как исправить? Просматривая массу форумов, легко увидеть, что Apache изменил способ чтения конфигураций в 2.2.13. Отлично. Но это не очень хорошо для меня или миллионов других веб-администраторов, у которых теперь есть веб-серверы, которые просто не запускаются, и сообщение об ошибке, в котором НИЧЕГО не говорится о проблеме или способах ее устранения.

Кто-нибудь еще действительно решил эту проблему? Раньше у меня были прекрасно работающие виртуальные серверы с SSL (на самом деле в течение многих лет).

Эта проблема вызвана изменением в apache 2.2.12 для поддержки SNI.

Вы можете найти все подробности по устранению проблемы в файле /usr/share/doc/apache2.2-common/NEWS.Debian.gz на вашем сервере:

apache2 (2.2.13-2) нестабильный; срочность = высокая

  • Новая поддержка TLS Server Name Indication, добавленная в 2.2.12, заставляет Apache более строго относиться к некоторым неправильным настройкам, связанным с виртуальными хостами SSL на основе имен. Это может привести к тому, что Apache откажется запускаться с зарегистрированным сообщением об ошибке:

    Сервер должен поддерживать SSL, но не имеет настроенного сертификата [Подсказка: SSLCertificateFile]

    До 2.2.11 Apache принимал конфигурации, в которых необходимые операторы конфигурации SSL были включены в первый (по умолчанию) блок, но не в последующие блоки. Начиная с 2.2.12, каждый блок VirtualHost, используемый с SSL, должен содержать директивы SSLEngine, SSLCertificateFile и SSLCertificateKeyFile (SSLCertificateKeyFile в некоторых случаях необязателен).

    Когда вы сталкиваетесь с вышеуказанной проблемой, вывод команды

    egrep -ir '^[^#]*(sslcertificate|sslengine|virtualhost)' \
        /etc/apache2/*conf* /etc/apache2/*enabled
    

    может быть полезно для определения того, какие разделы VirtualHost необходимо изменить.

    Кроме того, ранее случайно работающие конструкции вроде

    <VirtualHost *:80 *:443>
    

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

    <VirtualHost *:80>
    Include /.../vhost.include
    </VirtualHost>
    <VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile ...
    Include /.../vhost.include
    </VirtualHost>
    

    - Stefan Fritsch Ср, 16 сентября 2009 г. 20:14:59 +0200

Важная информация по обновлению пакетов доступна в файле NEWS.Debian для многих пакетов. Установка пакета apt-listchanges рекомендуется просматривать изменения в этих файлах при каждом обновлении.

Вам необходимо заменить:

Listen 443

с участием

Listen 443 http

В то же время я думаю, что это будет работать только в том случае, если вы унаследуете конфигурацию SSL от соответствующего виртуального хоста по умолчанию и используете такие конструкции, как <VirtualHost *:80 *:443>. В общем, это предполагало, что вы используете подстановочный SSL-сертификат. Это изменение отключит чеки для SSLCertificateFile в соответствующем VirtualHost.

Это НЕ отключит https функциональность для этого VirtualHost.

Хотя такая ошибка у вас будет с Apache 2.2.12, она была улучшена в Apache 2.2.14.

Согласно журналу изменений для Apache 2.2.14:

mod_ssl: сообщение об ошибке, когда SSLCertificateFile отсутствует, должно, по крайней мере, содержать имя или позицию определения проблемного виртуального хоста.

Поэтому, если в сообщении об ошибке указано имя / позиция проблемного определения - лучше проверить / исправить соответствующий виртуальный хост.

Это решение от Вот

Также вас могут заинтересовать сообщения Стефана Фрича. Вот

Я добавляю это, потому что именно так я решил проблему. Однако я даю ответ на этот вопрос @Fussy Salsify, который дал мне нужный мне ответ.

Согласно предложенной ссылке, /usr/share/doc/apache2.2-common/NEWS.Debian.gz, Я выполнил следующую команду из своего /etc/apache2 каталог:

egrep -ir '^[^#]*(sslcertificate|sslengine|virtualhost)' \
    /etc/apache2/*conf* /etc/apache2/*enabled

У меня на сервере около 5 разных виртуальных сайтов. Я нашел один сайт, на котором не было опций SSL внутри VirtualHost блок, например:

<VirtualHost *:443>
</VirtualHost>

Обратите внимание, что на других виртуальных сайтах на моем сервере были такие блоки:

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>

Итак, я открыл свой файл конфигурации для конкретного сайта в /etc/apache2/sites-enabled/nnn-specific и вставил строки:

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem

внутри <VirtualHost>...</VirtualHost> блок.

Теперь сервер запущен.

По-видимому, конфигурации VirtualHost использовались для наследования от первоначальной конфигурации VirtualHost. Это поведение обычно рекомендуется использовать в большинстве руководств по Apache - нам было поручено настроить хост по умолчанию (первый) с конфигурацией SSL, который будет унаследован всеми остальными. Я очень недоволен, что это было изменено.

Так как SNI не был доступен в Lenny (и до сих пор не поддерживается в MSIE / WinXP BTW). Я использовал сертификат домена с подстановочными знаками, а затем использовал VirtualDocumentRoot для предоставления нескольких виртуальных хостов с использованием одного и того же сертификата.

Вот как я исправил свою установку после обновления:

В /etc/apache2/ports.conf

<IfModule mod_ssl.c>
     # If you add NameVirtualHost *:443 here, you will also have to change
     # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
     # to <VirtualHost *:443>
     # Server Name Indication for SSL named virtual hosts is currently not
     # supported by MSIE on Windows XP.
     Listen 443
     ############ add this line below ##############
     NameVirtualHost *:443
 </IfModule>

Затем в default-ssl измените

<VirtualHost _default_:443>

к

<VirtualHost *:443>

надеюсь, что это поможет другим.

Богатый / хитрый робот.