プードルの脆弱性 のパッチをテストしようとしています。これには、WebサーバーでSSLv3を無効にすることが含まれます。これを非本番環境で最初にテストするために、別のテストサーバーのVirtualHostにSSLProtocolを設定しています。私の設定は次のようになります:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
ただし、Apacheを再起動した後でも、私のテストサイトは依然として脆弱であると主張されています。これはうまくいくと思われますか?私はそれをグローバルssl構成で設定する必要があるのか、それとも設定が機能しない、または機能しない原因となっている他に微妙な何かがあるのかと思っています。
SSLProtocolは、構成ファイルの最初のVirtualHostに対してのみ設定できます。以降のすべてのVirtualHostエントリは、最初のエントリからその設定を継承し、 OpenSSLバグ が原因で、独自の設定を暗黙的に無視します。
対応する mod_sslのバグレポート がありますが、バグレポートに記載されているように、OpenSSLで問題を解決する必要があります(証明書は継承されますが、プロトコルは継承されません)。
暗号スイートは、VirtualHostごとに個別に設定する必要があります。そうしないと、多くの安全でない暗号を含むデフォルトのリストが作成されます。また、サーバー名表示(SNI)をサポートしていない古いクライアントは常にデフォルトのホストを使用することに注意してください(ただし、 SSLStrictSNIVHostCheck
を使用してブロックされていない場合)、テストが混乱する可能性があります。
つまり、各仮想ホストのカスタム暗号スイートと証明書を指定できるはずですが、バグが修正されるまで、各仮想ホストのカスタムプロトコルでの正しい動作は期待できません。
私は、Apache 2.4とOpenSSL 1.0.1kを使用するmodsslでこの問題に遭遇し、Apache 2.2でも同じ問題が発生すると予想しています。
更新(2016年10月):OpenSSLバグは2016年10月13日に解決済みとしてマークされました。 「部分的な修正」が提供されましたが、問題は完全には解決されませんでした。
更新(2018年4月):再送信されたOpenSSLバグに パッチが利用可能 (2018年4月9日現在)が追加されました。このパッチは、複数のSNI仮想ホストで構成されたApacheインスタンスの動作を変更します。
Vhost SSLProtocolに準拠していない接続を拒否する
これは、2.4.27で開発およびテストされ、そのバージョンで運用されています。パッチは2.4.33用に変更され、簡単にテストされました。
これにより、SNIに基づいて一致する仮想ホスト用に構成されたSSLProtocolに対して接続のバージョンがチェックされます。接続は、ポートのデフォルトホスト用に構成されたSSLProtocolを使用して最初に作成されるため、デフォルトホストには、仮想ホストでサポートされるすべてのプロトコルを含める必要があります。
このパッチは、APR_EMISMATCHの戻りステータスをinit_vhost関数に追加して、OpenSSLに登録されたssl_callback_ServerNameIndicationコールバックが致命的なアラートSSL_AD_PROTOCOL_VERSIONを返すことができるようにします。これは、問題のバージョンが含まれていないSSLProtocolが指定されているのと同じ応答をClientHelloに生成することを目的としています。 SNIコールバックはClientHelloの処理中に呼び出され、応答が生成される前に呼び出されるため、まさにそのように見えます。
次の形式のメッセージが突然表示された場合:
Rejecting version [version] for servername [hostname]
次に、デフォルトのホストのSSLProtocol
を再確認する必要があります。
仮想ホストが異なるIPでリッスンしている場合は、仮想ホストごとに異なるSSLプロトコルを使用できます。
特定のホストがTLSv1を許可し、他のすべてのホストがTLSv1.1とTLSv1.2のみを許可し、もう1つがTLSv1.2のみを許可する例:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
<VirtualHost 10.0.0.2:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test2.mysite.com
</VirtualHost>
<VirtualHost 10.0.0.3:443>
SSLEngine On
SSLProtocol TLSv1.2
ServerName test2.mysite.com
</VirtualHost>
実際、vhostでサーバー名表示(SNI)を使用している場合、複数のSSLバージョンを定義することはできません。
ただし、専用サーバーを使用している場合は、サーバーに別のIPアドレスを追加できる可能性があります。これにより、IPごとに異なるSSLバージョンを使用できるようになります。期待するIP:443として仮想ホストの設定を変更するだけです。