Apache-2.2

Apache/GnuTLS:無法讓多個啟用 TLS 的虛擬主機工作

  • February 1, 2016

前段時間,我為我們的 Intranet 設置了 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  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頁面明確聲明它支持伺服器名稱指示,但對我來說,看起來情況並非如此。

誰能幫我 ?

經過與dkgin #mod_gnutlson 的多次討論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從這里這裡開始的一些指示。

引用自:https://serverfault.com/questions/597012