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

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

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

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

Я воссоздал корневой сертификат центра сертификации с нуля, создал новые сертификаты для каждого сайта и повторно развернул их. (Раньше я использовал суффикс файла .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

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

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

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

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

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