少し前に、イントラネットにSSL認証局を設定し、一連の証明書を生成して、それらを使用して多数のサイトを実行しました。これらはすべて、1つのApache2インストールで同じ物理ホスト上にあります。仮想ホストごとに1つのルート証明書と1つの証明書。クライアントマシンにルート証明書を追加しましたが、すべて問題ありませんでした(つまり、すべての通信が保護されていました)。
現在、mod_ssl
からmod_gnutls
に切り替えようとしています。 Apache2構成への変更は簡単でした。
a2dismod ssl
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 ページは、サーバー名表示をサポートしていることを明示的に示していますが、私には、これは単にそうではないように見えます。
誰かが私を助けることができますか?
#mod_gnutls
のirc.indymedia.org
のdkg
と何度か話し合った結果、 デフォルトバージョン0.5.10-1.1 のmod-gnutls
が最新のDebian7.5(パッケージ名libapache2-mod-gnutls
)は単にSNIを適切にサポートしていません-チャットからの引用:
sNIに関するかなり多くのバグが最新の0.6バージョンで修正されました
AFAICT、バージョン0.6はDebian 8(終了時にリリースされます;-)に予定されており、バックポートはないようです。回避策の1つは、ソースからmod-gnutls
とその依存関係GnuTLS
を構築することです。始めるためのいくつかのポインタ ここ および ここ 。