Apakah mungkin untuk menetapkan SSLProtocol di Apache untuk satu VirtualHost (pudel)?

13

Saya mencoba menguji patch untuk kerentanan pudel yang melibatkan menonaktifkan SSLv3 di server web saya. Untuk menguji ini pada lingkungan non-produksi terlebih dahulu, saya menetapkan SSLProtocol pada VirtualHost untuk server uji yang berbeda. Konfigurasi saya terlihat seperti ini:

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

Namun, bahkan setelah memulai kembali apache situs pengujian saya masih diklaim rentan. Apakah ini diharapkan berhasil? Saya bertanya-tanya apakah saya harus mengaturnya di global ssl config atau apakah ada sesuatu yang tidak kentara yang menyebabkan pengaturan tidak mengambil dan / atau bekerja.

Cory
sumber

Jawaban:

16

Anda dapat mengatur SSLProtocol hanya untuk VirtualHost pertama dalam file konfigurasi. Semua entri VirtualHost berikutnya akan mewarisi pengaturan itu dari entri pertama dan secara diam-diam mengabaikan pengaturan mereka sendiri karena bug OpenSSL .

Ada laporan bug yang sesuai untuk mod_ssl , tetapi seperti yang dijelaskan dalam laporan bug, masalahnya harus diselesaikan dalam OpenSSL (sertifikat diwarisi tetapi bukan protokolnya).

Suite sandi harus disetel secara independen untuk setiap VirtualHost, jika tidak, Anda akan berakhir dengan daftar default, termasuk banyak sandi tidak aman. Perlu diketahui juga bahwa klien lama yang tidak mendukung Indikasi Nama Server (SNI) akan selalu menggunakan host default (kecuali diblokir menggunakanSSLStrictSNIVHostCheck ), yang dapat mengacaukan pengujian Anda.

Singkatnya, Anda harus dapat menentukan suite cipher khusus dan sertifikat untuk setiap host virtual, tetapi sampai bug diperbaiki jangan berharap perilaku yang benar dengan protokol khusus untuk setiap host virtual.

Saya mengalami masalah ini dengan Apache 2.4 dan modssl dengan OpenSSL 1.0.1k, dan saya berharap bahwa Apache 2.2 akan mengalami masalah yang sama.

Pembaruan (Oktober 2016): Bug OpenSSL ditandai telah diselesaikan pada 13 Oktober 2016. Namun, itu adalah bagian dari penutupan massal masalah terbuka dan meskipun 'perbaikan parsial' diberikan, masalahnya tidak pernah sepenuhnya diatasi.

Pembaruan (April 2018): Bug OpenSSL yang dikirimkan kembali sekarang memiliki tambalan yang tersedia (pada 9 April 2018). Patch ini akan mengubah perilaku instance Apache yang dikonfigurasi dengan beberapa host virtual SNI:

Tolak koneksi yang tidak sesuai dengan vhost SSLProtocol

Ini dikembangkan dan diuji dengan 2.4.27 dan diproduksi dengan versi itu. Patch itu dimodifikasi untuk 2.4.33 dan sedikit diuji.

Ini memeriksa versi koneksi terhadap SSLProtocol yang dikonfigurasikan untuk virtual host yang dicocokkan berdasarkan SNI. Karena koneksi pada awalnya dibuat dengan SSLProtocol yang dikonfigurasikan untuk host default untuk port, host default harus menyertakan semua protokol yang akan didukung oleh host virtual apa pun.

Patch ini menambahkan status pengembalian tambahan APR_EMISMATCH ke fungsi init_vhost sehingga panggilan balik ssl_callback_ServerNameIndication terdaftar dengan OpenSSL dapat mengembalikan lansiran fatal SSL_AD_PROTOCOL_VERSION. Ini dimaksudkan untuk menghasilkan respons yang sama kepada ClientHello dengan memiliki SSLProtocol yang ditentukan yang tidak menyertakan versi yang dipermasalahkan. Karena panggilan balik SNI dipanggil selama pemrosesan ClientHello dan sebelum tanggapan dibuat, tampaknya melakukan hal itu.

Jika Anda tiba-tiba melihat pesan dengan format berikut:

Rejecting version [version] for servername [hostname]

Maka Anda harus mengecek SSLProtocolhost default Anda.

vallismortis
sumber
Informasi tambahan yang ditambahkan oleh @anx SSLStrictSNIVHostChecksangat dihargai. Namun, juga harus dicatat dari dokumentasi menyebutkan bahwa Jika set untuk di dalam virtual host lainnya, SNI klien menyadari tidak diizinkan untuk mengakses virtual host tertentu .
vallismortis
5

Anda dapat memiliki protokol SSL yang berbeda untuk setiap Vhost jika mereka mendengarkan pada IP yang berbeda.

Contoh dengan host tertentu yang mengizinkan TLSv1 dan yang lainnya hanya mengizinkan TLSv1.1 dan TLSv1.2 - dan satu yang hanya mengizinkan 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>
BitLegacy01
sumber
Selain itu, jika Anda memerlukannya untuk tujuan pengujian saja, Anda dapat menggunakan port lain alih-alih IP lain, mis 8443. Port HTTPS alternatif umum .
Esa Jokinen
0

Jika Anda menggunakan Indikasi Nama Server (SNI) dengan vhost Anda, tentu saja, Anda tidak dapat mendefinisikan beberapa versi SSL.

Namun, jika Anda menggunakan server khusus, Anda mungkin dapat menambahkan alamat IP lain ke server Anda. Dengan cara ini, Anda akan dapat menggunakan versi SSL yang berbeda per IP. Anda hanya perlu mengubah pengaturan vhost Anda seperti yang diharapkan IP: 443.

tryp
sumber
-2

Atau Anda dapat menggunakan:

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

Saya diuji pada banyak server dan bekerja untuk saya! Anda dapat menguji situs Anda di situs web ini

Rodrigo Moreno
sumber
4
Baris SSLProtocol ini hanya terlihat berfungsi karena Apache tidak mengeluh. Pada kenyataannya, hanya SSLProtocol di entri VirtualHost pertama yang digunakan.
vallismortis