Apache / GnuTLS: não é possível fazer com que vários hosts virtuais habilitados para TLS funcionem

2

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?

    
por ssc 19.05.2014 / 18:26

1 resposta

1

Depois de várias discussões com dkg em #mod_gnutls sobre irc.indymedia.org , descobriu-se que a versão padrão 0.5.10-1.1 de mod-gnutls na última Debian 7.5 (nome do pacote libapache2-mod-gnutls ) simplesmente não suporta SNI corretamente - citação do bate-papo:

quite a lot of bugs around SNI were fixed in the latest 0.6 version

AFAICT, versão 0.6, está programada para o Debian 8 (que será lançado quando terminar ;-) e não parece haver nenhum backport. Uma solução alternativa é criar mod-gnutls e sua dependência GnuTLS das origens; algumas dicas para começar aqui e aqui .

    
por 18.06.2014 / 18:58