Apache/GnuTLS: невозможно заставить работать несколько виртуальных хостов с поддержкой TLS

Некоторое время назад я настроил центр сертификации SSL для нашей интрасети, сгенерировал несколько сертификатов и запустил с ними несколько сайтов, все на одном физическом хосте с одной установкой Apache2; один корневой сертификат и один сертификат для каждого виртуального хоста. Я добавил корневой сертификат на клиентские машины, и все было хорошо (т.е. все коммуникации были защищены).

Сейчас я пытаюсь переключиться с mod_ssl в mod_gnutls, Изменения в конфигурации Apache2 были просты:

  • отключить модуль SSL: a2dismod ssl
  • включите модуль GnuTLS: a2enmod gnutls
  • добавить новый раздел в /etc/apache2/ports.conf с тем же содержанием, что и в разделе SSL:

    <IfModule mod_gnutls.c>
      NameVirtualHost *:443
      Listen 443
    </IfModule>
    
  • изменить настройки для каждого сайта, например, /etc/apache2/sites-available/site1.domain-ssl:

    <IfModule mod_gnutls.c> 
      <VirtualHost *:443>
        ServerAdmin  webmaster@site1.domain
        ServerName   site1.domain
        DocumentRoot /var/www/site1.domain_ssl/public_html/
        ErrorLog     /var/www/site1.domain_ssl/logs/error.log
        CustomLog    /var/www/site1.domain_ssl/logs/access.log combined
        LogLevel     debug
    
        # <Directory ... > settings omitted
    
        # old SSL configuration:
        # SSLEngine on
        # SSLCertificateFile    /etc/ssl/certs/site1.cert.pem
        # SSLCertificateKeyFile /etc/ssl/private/site1.key.pem
    
        # new TLS configuration
        GnuTLSEnable on
        GnuTLSPriorities NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT
        GnuTLSCertificateFile /etc/ssl/certs/site1.domain.cert
        GnuTLSKeyFile         /etc/ssl/private/site1.domain.key
      </VirtualHost>
    </IfModule>
    

Я заново создал корневой сертификат центра сертификации с нуля, создал новые сертификаты для каждого сайта и повторно развернул их. (Раньше я использовал суффикс файла.pem с SSL, но пропустил его при переходе на GnuTLS).

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

Когда я пытаюсь подключиться к физическому хосту, все выглядит нормально:

user@host:~$ gnutls-cli-debug host
Resolving 'host'...
Connecting to '127.0.1.1:443'...
Checking for SSL 3.0 support... yes
Checking whether %COMPAT is required... no
Checking for TLS 1.0 support... yes
Checking for TLS 1.1 support... yes
  ... (etc.) ...

и когда я подключаюсь с помощью gnutls-cli --x509cafile <my root cert file>корневой сертификат успешно подтвержден.

Однако, когда я пытаюсь подключиться к одному из виртуальных хостов, это происходит:

user@host:~$ gnutls-cli-debug site1
Resolving 'site1'...
Connecting to '192.168.137.135:443'...
Checking for SSL 3.0 support...|<1>| Received record packet of unknown type 60
 no
Checking whether %COMPAT is required...|<1>| Received record packet of unknown type 60
 yes
Checking for TLS 1.0 support...|<1>| Received record packet of unknown type 60
 no
Checking for TLS 1.1 support...|<1>| Received record packet of unknown type 60
 no
  ... (etc.) ...

и я получаю сообщение об ошибке, подобное этому в журнале Apache:

[Mon May 19 17:55:35 2014] [info] [client 127.0.0.1] GnuTLS: Handshake Failed (-21) 'Could not negotiate a supported cipher suite.'
[Mon May 19 17:55:35 2014] [info] (70014)End of file found: GnuTLS: Error reading data. (-9) 'A TLS packet with unexpected length was received.'
[Mon May 19 17:59:58 2014] [error] [client 192.168.137.135] Invalid method in request \x16\x03

Конечно, в Google есть много результатов об этих ошибках, но, несмотря на то, что они потратили почти все выходные, ничего не пришло.

Все это происходит при новой установке последней версии Debian 7.5 i386 на виртуальную машину (которую я настроил для поиска ошибки, фактический сервер интрасети - это реальная машина), поэтому Apache поддерживает SNI:

user@host:~$ aptitude show apache2-mpm-worker | grep Version
Version: 2.2.22-13+deb7u1
user@host:~$ aptitude show libapache2-mod-gnutls | grep Version
Version: 0.5.10-1.1

На странице mod-gnutls четко указано, что она поддерживает указание имени сервера, но, на мой взгляд, это просто не тот случай.

Может кто-нибудь мне помочь?

1 ответ

Решение

После нескольких обсуждений с dkg в #mod_gnutls на irc.indymedia.org Оказалось, что версия по умолчанию 0.5.10-1.1 из mod-gnutls в последней версии Debian 7.5 (имя пакета libapache2-mod-gnutls) просто не поддерживает SNI должным образом - цитата из чата:

в последней версии 0.6 исправлено довольно много ошибок вокруг SNI

AFAICT, версия 0.6 запланирована для Debian 8 (которая выйдет после ее завершения;-) и, похоже, никаких бэкпортов нет. Один из обходных путей заключается в создании mod-gnutls и его зависимость GnuTLS из источников; некоторые указатели, чтобы начать здесь и здесь.

Другие вопросы по тегам