構成ファイルの最初の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
、デフォルトのホストを再確認する必要があります。
SSLStrictSNIVHostCheck
は大歓迎です。ただし、他の仮想ホストでonに設定されている場合、SNI非対応クライアントはこの特定の仮想ホストへのアクセスを許可されないことも、引用されたドキュメントから注意する必要があります。