Некоторое время назад я установил центр сертификации SSL для нашей интрасети, сгенерировал несколько сертификатов и запустил с ними несколько сайтов, все на одном физическом хосте с одной установкой Apache2; один корневой сертификат и один сертификат для каждого виртуального хоста. Я добавил корневой сертификат на клиентские машины, и все было в порядке (т.е. все коммуникации были защищены).
Сейчас я пытаюсь переключиться с mod_ssl
к mod_gnutls
. Изменения в конфигурации Apache2 были простыми:
a2dismod ssl
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
В мод-гнутлс на странице явно указано, что он поддерживает указание имени сервера, но мне кажется, что это просто не так.
Может кто-нибудь помочь мне ?
После нескольких обсуждений с 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
из источников; несколько указателей для начала Вот и Вот.