Há algum tempo atrás, configurei uma autoridade de certificação SSL para nossa intranet, gerando vários certificados e executando vários sites com eles, todos no mesmo host físico com uma única instalação do Apache2; um certificado raiz e um certificado para cada host virtual. Eu adicionei o certificado raiz para as máquinas clientes e estava tudo bem (ou seja, toda a comunicação estava protegida).
Agora estou tentando mudar de mod_ssl
para mod_gnutls
. Mudanças na configuração do Apache2 foram simples:
- desative o módulo SSL:
a2dismod ssl
- ative o módulo GnuTLS:
a2enmod gnutls
-
adicione uma nova seção a /etc/apache2/ports.conf
com o mesmo conteúdo da seção SSL:
<IfModule mod_gnutls.c>
NameVirtualHost *:443
Listen 443
</IfModule>
-
alterar configurações por site em, e. /etc/apache2/sites-available/site1.domain-ssl
:
<IfModule mod_gnutls.c>
<VirtualHost *:443>
ServerAdmin [email protected]
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>
Recriei o certificado raiz da autoridade de certificação do zero, criei novos certificados por site e os reimprimi. (Eu costumava usar o sufixo de arquivo .pem com SSL, mas descartei isso ao mudar para o GnuTLS).
O problema é agora que não consigo acessar nenhum host virtual.
Quando tento me conectar ao host físico, tudo parece bem:
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.) ...
e quando eu me conecto usando gnutls-cli --x509cafile <my root cert file>
, o certificado raiz é validado com sucesso.
No entanto, quando tento me conectar a um dos hosts virtuais, isso acontece:
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.) ...
e recebo uma mensagem de erro como esta no log do 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
É claro que há muitos resultados do Google sobre esses erros, mas, apesar de ter gasto praticamente todo o final de semana pesquisando, nada de conclusivo surgiu.
Tudo isso está acontecendo sob uma nova instalação do Debian 7.5 i386 em uma VM (que configurei para encontrar o erro, o servidor de intranet real é uma máquina real), então o Apache faz suporte ao 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
A página mod-gnutls afirma explicitamente que ela suporta Indicação de nome de servidor, mas para mim parece que isso simplesmente não é caso.
Alguém pode me ajudar?