単一のVirtualHost(poodle)に対してApacheでSSLProtocolを設定することは可能ですか?


13

WebサーバーでSSLv3を無効にすることを含むpoodleの脆弱性に対するパッチをテストしようとしています。これを非実稼働環境で最初にテストするために、異なるテストサーバーのVirtualHostでSSLProtocolを設定しています。私の設定は次のようになります:

<VirtualHost *:443>
    SSLEngine On
    SSLProtocol All -SSLv2 -SSLv3
    ServerName test.mysite.com
    # bunch of other stuff omitted
</VirtualHost>

ただし、Apacheを再起動した後でも、私のテストサイトは脆弱であると主張されています。これは機能すると予想されますか?グローバルなssl configで設定する必要があるのか​​、それとも設定が機能しなかったり動作しない原因となっている微妙なものがあるのか​​どうか疑問に思っています。

回答:


16

構成ファイルの最初のVirtualHostにのみSSLProtocolを設定できます。後続のすべての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、デフォルトのホストを再確認する必要があります。


@anxによって追加された追加情報SSLStrictSNIVHostCheckは大歓迎です。ただし、他の仮想ホストでon設定されいる場合、SNI非対応クライアントはこの特定の仮想ホストへのアクセスを許可されないことも、引用されたドキュメントから注意する必要があります
-vallismortis

5

仮想ホストが異なるIPでリッスンしている場合、仮想ホストごとに異なるSSLプロトコルを使用できます。

TLSv1を許可する特定のホスト、およびTLSv1.1とTLSv1.2のみを許可する他のすべてのホスト、および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>

また、テスト目的でのみ必要な場合は、別のIPの代わりに別のポート(一般的な代替HTTPSポートなど)を使用できます8443
エサヨキネン

0

実際、vhostでサーバー名表示(SNI)を使用している場合、複数のSSLバージョンを定義することはできません。

ただし、専用サーバーを使用している場合は、サーバーに別のIPアドレスを追加できる可能性があります。これにより、IPごとに異なるSSLバージョンを使用できます。期待どおりにIP:443としてvhost設定を変更する必要があります。


-2

または、次を使用できます。

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

私は多くのサーバーでテストされ、私のために働いています!このウェブサイトでサイトをテストできます


4
このSSLProtocol行は、Apacheが文句を言わないため、機能しているように見えます。実際には、最初のVirtualHostエントリのSSLProtocolのみが使用されます。
-vallismortis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.