Saya memiliki Apache 2.2 dengan mod_ssl dan banyak situs di HTTPS pada IP / port yang sama dengan VirtualHosting, jadi klien harus mendukung SNI untuk terhubung ke host virtual tersebut.
Saya ingin mengonfigurasi server saya dengan cara berikut:
Ketika pengguna mengetikkan www.dummysite.com dan browsernya mendukung SNI (Server Name Indication), setiap permintaan HTTP dialihkan ke https://
tempat header HSTS dikirim. Tetapi jika browser tidak mendukung SNI maka permintaan dilayani oleh HTTP.
Aturan di atas, dinyatakan apa adanya, sebenarnya adalah aturan fallback untuk orang-orang yang masih menjalankan browser lama, karena Mozilla dan Chrome tidak memiliki masalah ini, hanya untuk menghindari meninggalkan para pengguna ini dari situs.
Saya ingin melakukan pengalihan ini di tingkat konfigurasi Apache, mungkin dengan filter pada agen pengguna. Saya tidak ingin menyentuh aplikasi yang sedang berjalan kecuali memastikan tidak ada http langsung: // referensi ada (jika tidak mereka menyiratkan peringatan keamanan)
[Sunting] (ketika mengedit pertanyaan saya lupa yang pertanyaan): apa daftar agen pengguna SNI-enabled untuk mengarahkan?
sumber
Solusi saya adalah ini:
Jika peramban lama tanpa SNI mencoba mengakses https://www.example.com/ * maka peramban itu akan melakukan kesalahan pada peramban terlebih dahulu, yang tidak dapat dihindari sejak sampai apache membalas peramban non-SNI, ia tidak tahu. situs mana yang diminta. Kemudian ia dialihkan ke halaman yang memberi tahu pengguna bahwa browser mereka terlalu lama (selama klik pengguna berlanjut ke situs web).
Dan untuk pengguna dengan browser baru yang saya miliki
Itu tidak termasuk sebagian besar browser lama, termasuk beberapa seperti MSIE 5-8 pada Vista (9+ hanya Vista / 7 jadi mendukung SNI). Ini bukan 100% (symbian diabaikan dll.) Tetapi harus bekerja untuk mayoritas. Minoritas masih dapat memilih untuk menerima kesalahan sertifikat.
sumber
Sejauh yang saya tahu ada tidak benar-benar cara yang baik untuk melakukan hal ini - Anda dapat menggunakan aturan mod_rewrite atau serupa bersyarat berdasarkan
User-agent
header, tetapi harus berada pada vhost NON-SSL: Jika browser tidak mendukung SNI dan masuk ke situs aman (https://
) itu akan mendapatkan perilaku Apache jadul dari "Ini sertifikat SSL pertama yang saya kaitkan dengan alamat IP itu - Semoga itu yang Anda inginkan!" - Jika itu bukan sertifikat yang diharapkan peramban Anda akan berakhir dengan pesan kesalahan tentang ketidakcocokan nama host.Ini pada dasarnya berarti orang harus membuka halaman pengantar non-SSL yang akan mengarahkan mereka - mungkin mengekspos data apa pun yang mereka kirim dalam permintaan mereka. Ini mungkin atau mungkin bukan pelanggar kesepakatan (Anda mengatakan Anda akan mengirimnya ke situs non-SSL jika mereka tidak mendukung SNI, jadi saya menganggap Anda tidak terlalu peduli dengan keamanan. merancang sistem yang membutuhkan SSL sebagai lapisan enkripsi atau otentikasi saya akan sedikit lebih mendesak tentang hal itu ...)
Namun, tidak ada yang menghentikan seseorang untuk mem-bookmark situs yang aman - dan jika mereka menggunakan layanan bookmark bersama atau mengembalikan bookmark mereka ke mesin di mana browser web tidak mendukung SNI, mereka kembali ke kasus Potensi-untuk-SSL-Kesalahan. .
sumber
Saya akan tergoda untuk memecahkan ini satu dari tiga cara:
RewriteRule
berdasarkanUser-Agent
header.<SCRIPT>
tag di VHost non-default; jika memuat berhasil, itu sedikit JS yang memuat ulang seluruh halaman di bawah HTTPS.Dari jumlah tersebut, saya pribadi paling suka # 2, tetapi itu melibatkan memodifikasi kode situs Anda.
sumber
Hanya untuk siapa saja yang membutuhkannya.
Jika Anda memiliki banyak host dan ingin semuanya diaktifkan dengan SSL di VirtualHosting (dan Anda membeli sertifikat untuk masing-masing) coba yang baru
mod_djechelon_ssl
Pemakaian:
sumber
Seperti yang saya posting di sini , Anda hanya dapat menguji dukungan SNI sebelum memerlukannya. Artinya, Anda tidak dapat memaksa pengguna menggunakan SNI HTTPS dan kemudian mundur jika mereka tidak mendukungnya, karena mereka akan menerima kesalahan seperti ini (dari Chrome di Windows XP) tanpa jalan untuk melanjutkan.
Jadi (sayangnya) pengguna harus benar-benar memulai koneksi HTTP yang tidak aman dan kemudian ditingkatkan hanya jika mereka mendukung SNI.
Anda dapat mendeteksi dukungan SNI melalui:
Skrip jarak jauh
Dari halaman HTTP biasa Anda, muat a
<script>
dari server HTTPS SNI tujuan Anda dan jika skrip dimuat dan berjalan dengan benar, Anda tahu browser mendukung SNI.Cross-Domain AJAX (CORS)
Mirip dengan opsi 1, Anda dapat mencoba melakukan permintaan AJAX lintas-domain dari halaman HTTP ke HTTPS, tetapi perlu diketahui bahwa CORS hanya memiliki dukungan browser yang terbatas .
Menghirup agen-pengguna
Ini mungkin metode yang paling tidak dapat diandalkan, dan Anda harus memutuskan antara memiliki daftar hitam peramban (dan sistem operasi) yang diketahui tidak mendukungnya, atau daftar putih dari sistem yang dikenal yang melakukannya.
Kita tahu bahwa semua versi IE, Chrome & Opera di Windows XP dan di bawahnya tidak mendukung SNI. Lihat CanIUse.com untuk daftar lengkap browser yang didukung .
sumber