web-dev-qa-db-ja.com

Apache / GnuTLS:複数のTLS対応仮想ホストを機能させることができません

少し前に、イントラネットにSSL認証局を設定し、一連の証明書を生成して、それらを使用して多数のサイトを実行しました。これらはすべて、1つのApache2インストールで同じ物理ホスト上にあります。仮想ホストごとに1つのルート証明書と1つの証明書。クライアントマシンにルート証明書を追加しましたが、すべて問題ありませんでした(つまり、すべての通信が保護されていました)。

現在、mod_sslからmod_gnutlsに切り替えようとしています。 Apache2構成への変更は簡単でした。

  • 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

    <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>を使用して接続すると、ルート証明書が正常に検証されます。

ただし、仮想ホストの1つに接続しようとすると、次のようになります。

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.5i386をVM(エラーを見つけるために設定したもので、実際のイントラネットサーバーは実際のマシンです)に新規インストールした場合に発生します)。 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 ページは、サーバー名表示をサポートしていることを明示的に示していますが、私には、これは単にそうではないように見えます。

誰かが私を助けることができますか?

2
ssc

#mod_gnutlsirc.indymedia.orgdkgと何度か話し合った結果、 デフォルトバージョン0.5.10-1.1mod-gnutlsが最新のDebian7.5(パッケージ名libapache2-mod-gnutls)は単にSNIを適切にサポートしていません-チャットからの引用:

sNIに関するかなり多くのバグが最新の0.6バージョンで修正されました

AFAICT、バージョン0.6はDebian 8(終了時にリリースされます;-)に予定されており、バックポートはないようです。回避策の1つは、ソースからmod-gnutlsとその依存関係GnuTLSを構築することです。始めるためのいくつかのポインタ ここ および ここ

1
ssc