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
из источников; некоторые указатели, чтобы начать здесь и здесь.