Apache/GnuTLS:無法讓多個啟用 TLS 的虛擬主機工作
前段時間,我為我們的 Intranet 設置了 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 webmaster@site1.domain 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
當然,有很多關於這些錯誤的Google搜尋結果,但儘管花費了整個週末的時間搜尋,但沒有得出任何結論。
這一切都是在虛擬機上全新安裝最新的 Debian 7.5 i386 時發生的(我已經設置它來查找錯誤,實際的 Intranet 伺服器是一台真實機器),因此 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頁面明確聲明它支持伺服器名稱指示,但對我來說,看起來情況並非如此。
誰能幫我 ?
經過與
dkg
in#mod_gnutls
on 的多次討論irc.indymedia.org
,事實證明,最新的 Debian 7.5(包名稱)中的預設版本 0.5.10-1.1根本不正確支持 SNI - 引用自聊天:mod-gnutls``libapache2-mod-gnutls
在最新的 0.6 版本中修復了很多關於 SNI 的錯誤
AFAICT,0.6 版計劃用於 Debian 8(將在完成後發布;-),並且似乎沒有任何向後移植。一種解決方法是從原始碼建構
mod-gnutls
及其依賴關係GnuTLS
;從這里和這裡開始的一些指示。