Topik ini menjelaskan cara menyelesaikan pengecualian akses HTTPS yang disebabkan oleh masalah kompatibilitas Server Name Indication (SNI) antar klien setelah layanan web terkait ditambahkan ke Web Application Firewall (WAF).
Latar Belakang
Hosting virtual diperkenalkan untuk mengatasi tantangan kekurangan alamat IP. Hosting virtual memungkinkan satu server HTTP atau HTTPS menampung beberapa nama domain dengan berbagi alamat IP yang sama. Dalam hal ini, setiap nama domain berfungsi sebagai host virtual. Server dapat mengalokasikan permintaan ke host virtual yang berbeda berdasarkan header Host dalam permintaan klien. Sebagai contoh, sebelum browser mengakses situs web HTTPS yang dihosting pada server tempat hosting virtual diaktifkan, browser harus membuat koneksi SSL dengan server dan meminta sertifikat server yang diperlukan. Namun, server tidak dapat mengidentifikasi nama domain mana yang diakses dan tidak dapat mengembalikan sertifikat yang sesuai.
SNI adalah ekstensi SSL/TLS yang dirancang untuk menyelesaikan masalah ini. Sebelum koneksi SSL dibuat dengan server, browser mengirimkan nama host yang menentukan nama domain untuk diakses ke server. Kemudian, server mengidentifikasi dan mengembalikan sertifikat untuk nama domain tersebut.
Sebagian besar sistem operasi dan browser mendukung SNI. OpenSSL 0.9.8 mendukung SNI bawaan. Versi baru server NGINX juga mendukung SNI.
Deskripsi Masalah
Jika situs web Anda mengalami pengecualian akses HTTPS setelah ditambahkan ke WAF, klien terkait mungkin tidak mendukung SNI.
Jika browser yang tidak mendukung SNI digunakan untuk mengakses situs web yang dilindungi WAF, WAF tidak dapat mengidentifikasi nama domain spesifik yang diminta atau mendapatkan sertifikat yang diperlukan untuk nama domain tersebut untuk berinteraksi dengan browser. Dalam hal ini, WAF menggunakan sertifikat default untuk menyelesaikan proses jabat tangan dengan browser, dan browser melaporkan kesalahan "Sertifikat tidak dipercaya".
Jika klien tidak mendukung SNI, masalah berikut mungkin terjadi:
Jika klien adalah aplikasi seluler yang berjalan di iOS, akses berhasil. Jika klien adalah aplikasi seluler yang berjalan di Android, akses gagal.
Jika klien adalah browser, kesalahan "Sertifikat tidak dipercaya" dilaporkan.
Solusi
Tangkap paket jabat tangan SSL di sisi klien untuk menentukan apakah klien mendukung SNI. Dalam contoh ini, browser Chrome digunakan untuk mengakses situs resmi Alibaba Cloud.
Jika informasi SNI termasuk dalam paket Client Hello, klien mendukung SNI.
Sebaliknya, klien tidak mendukung SNI. Rekomendasi:
Perbarui browser Anda atau gunakan versi terbaru dari browser, seperti Chrome dan Firefox.
Dalam skenario panggilan balik pihak ketiga seperti panggilan balik WeChat atau Alipay, gunakan alamat IP server asal untuk melewati WAF.
Kompatibilitas SNI
SNI kompatibel dengan TLS1.0 dan versi lebih baru tetapi tidak didukung oleh SSL.
SNI mendukung browser desktop berikut:
Chrome 5 dan versi lebih baru
Chrome 6 dan versi lebih baru (Windows XP)
Firefox 2 dan versi lebih baru
IE 7 dan versi lebih baru (di Windows Vista/Server 2008 dan versi lebih baru, tidak termasuk IE versi apa pun di Windows XP)
Konqueror 4.7 dan versi lebih baru
Opera 8 dan versi lebih baru
Safari 3.0 di Windows Vista/Server 2008 dan versi lebih baru atau Mac OS X 10.5.6 dan versi lebih baru
SNI mendukung pustaka berikut:
GNU TLS
Java 7 dan versi lebih baru (hanya berfungsi sebagai klien)
HTTP client 4.3.2 dan versi lebih baru
libcurl 7.18.1 dan versi lebih baru
NSS 3.1.1 dan versi lebih baru
OpenSSL 0.9.8j dan versi lebih baru
OpenSSL 0.9.8f dan versi lebih baru (flags diperlukan)
QT 4.8 dan versi lebih baru
Python3, Python 2.7.9, dan versi lebih baru
SNI mendukung browser seluler berikut:
Android Browser di 3.0 Honeycomb dan versi lebih baru
iOS Safari di iOS 4 dan versi lebih baru
Windows Phone 7 dan versi lebih baru
SNI mendukung server berikut:
Apache 2.2.12 dan versi lebih baru
Apache Traffic Server 3.2.0 dan versi lebih baru
HAProxy 1.5 dan versi lebih baru
IIS 8.0 dan versi lebih baru
lighttpd 1.4.24 dan versi lebih baru
LiteSpeed 4.1 dan versi lebih baru
Nginx 0.5.32 dan versi lebih baru
SNI mendukung antarmuka baris perintah berikut:
cURL 7.18.1 dan versi lebih baru
wget 1.14 dan versi lebih baru