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