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

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

不久前,我为我们的内联网设置了一个 SSL 证书颁发机构,生成了一堆证书,并用它们运行了多个网站,所有这些都在同一个物理主机上,只安装了一个 Apache2;一个根证书和每个虚拟主机一个证书。我将根证书添加到客户端计算机,一切正常(即所有通信都受到保护)。

现在我正尝试从 切换mod_sslmod_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  [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>
    

我从头开始重新创建了证书颁发机构根证书,创建了新的每个站点证书并重新部署了它们。(我以前在 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>,根证书已成功验证。

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

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

当然,谷歌搜索到了很多关于这些错误的搜索结果,但是尽管我花了几乎整个周末的时间进行搜索,却没有得到任何结论性的结论。

这一切都是在虚拟机上全新安装最新的 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

模式-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 中的大量错误

据我所知,0.6 版计划用于 Debian 8(完成后将发布 ;-),似乎没有任何反向移植。一种解决方法是从源代码构建mod-gnutls及其依赖项;一些入门指南GnuTLS这里这里

相关内容