Apache / GnuTLS:无法使多个启用TLS的虚拟主机正常工作

前一段时间,我为我们的Intranet设置了一个SSL证书颁发机构,生成了一堆证书并运行了许多站点,所有这些证书都在同一个物理主机上,只有一个Apache2安装; 每个虚拟主机一个根证书和一个证书。 我将根证书添加到客户端机器,一切都很好(即所有通信都受到保护)。

现在我正试图从mod_ssl切换到mod_gnutls 。 对Apache2configuration的更改很简单:

  • 禁用SSL模块: a2dismod ssl
  • 启用GnuTLS模块: a2enmod gnutls
  • 使用与SSL部分相同的内容向/etc/apache2/ports.conf添加新节:

     <IfModule mod_gnutls.c> NameVirtualHost *:443 Listen 443 </IfModule> 
  • 更改/etc/apache2/sites-available/site1.domain-ssl每个站点configuration:

     <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> 

我从零开始重新创build了证书颁发机构根证书,创build了新的每个站点证书并重新部署它们。 (我曾经使用SSL的.pem文件后缀,但是当切换到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> ,根证书被validation成功。

但是,当我尝试连接到其中一个虚拟主机时,会发生这种情况:

 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对这些错误的结果还是很多的,但是尽pipe花了整个周末的search时间,但没有任何结论出现。

这一切都是在虚拟机上安装最新的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页面明确指出它支持服务器名称指示,但是对我来说,看起来事实并非如此。

谁能帮我 ?

在与#mod_gnutls上的dkg进行了几次讨论后irc.indymedia.org ,最新的Debian 7.5(软件包名称libapache2-mod-gnutls )中的mod-gnutls的默认版本0.5.10-1.1根本不支持SNI正确 – 从聊天报价:

在最新的0.6版本中,很多SNI周围的bug都被修复了

AFAICT,版本0.6预定在Debian 8(它将在完成时发布;-),并且似乎没有任何后端。 一种解决方法是从源代码构buildmod-gnutls及其依赖项GnuTLS ; 一些指针开始在这里和这里 。