Mengatasi ERR_SSL_VERSION_OR_CIPHER_MISMATCH di Cloudflare (Ternyata Karena Subdomain Bertingkat)
Beberapa waktu lalu saya mengalami error yang cukup membingungkan ketika mencoba membuka salah satu aplikasi self-hosted saya. Setup infrastrukturnya kira-kira seperti ini:
Domain → Cloudflare Tunnel → Nginx Proxy Manager → Docker App
Semua service sebenarnya berjalan normal. Container hidup, reverse proxy aktif, dan tunnel juga terkoneksi dengan baik. Tapi ketika aplikasi diakses melalui browser, yang muncul justru error ini:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Sekilas error ini terlihat seperti masalah TLS atau cipher SSL, tapi ternyata penyebabnya sama sekali berbeda.
Di artikel ini saya akan berbagi pengalaman troubleshooting sampai akhirnya menemukan penyebabnya.
Gejala yang Terlihat
Error muncul ketika mengakses domain aplikasi, misalnya seperti ini:
https://sub.service.mydomain.com
Browser langsung menampilkan halaman error:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Biasanya error ini diasosiasikan dengan:
- TLS version tidak cocok
- cipher tidak didukung
- konfigurasi SSL salah
Karena itu saya mencoba mengecek koneksi menggunakan openssl.
openssl s_client -connect sub.service.mydomain.com:443
Hasilnya kurang lebih seperti ini:
SSL alert handshake failure
no peer certificate available
Cipher is (NONE)
Yang menarik di sini adalah bagian:
no peer certificate available
Artinya server bahkan tidak mengirim certificate sama sekali.
Mengecek dengan Curl
Untuk memastikan, saya juga mencoba menggunakan curl.
curl -Iv https://sub.service.mydomain.com
Hasilnya:
TLS alert handshake failure
Ini menandakan bahwa TLS handshake gagal sebelum koneksi benar-benar terjadi.
Artinya masalah kemungkinan besar bukan di server aplikasi, tetapi terjadi lebih awal di jalur koneksi.
Petunjuk Penting dari Cloudflare
Saat mengecek DNS record di dashboard Cloudflare, saya menemukan sebuah catatan kecil di bagian hostname:
This hostname is not covered by a certificate.
Ini langsung memberi petunjuk kuat bahwa masalahnya berkaitan dengan certificate coverage.
Penyebab Sebenarnya: Subdomain Bertingkat
Cloudflare Free Plan menggunakan Universal SSL. Secara default, Cloudflare hanya membuat certificate untuk:
mydomain.com
*.mydomain.com
Artinya hanya subdomain satu level yang tercakup.
Contoh yang didukung:
app.mydomain.com
monitor.mydomain.com
grafana.mydomain.com
status.mydomain.com
Contoh yang tidak didukung:
monitor.service.mydomain.com
grafana.monitor.mydomain.com
api.dev.mydomain.com
Domain yang saya gunakan ternyata termasuk kategori kedua:
monitor.service.mydomain.com
Strukturnya seperti ini:
mydomain.com
└ service.mydomain.com
└ monitor.service.mydomain.com
Wildcard certificate:
*.mydomain.com
tidak bisa mencakup domain:
monitor.service.mydomain.com
Akibatnya Cloudflare tidak memiliki certificate untuk hostname tersebut, sehingga TLS handshake gagal dan browser menampilkan error:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Padahal sebenarnya bukan masalah cipher sama sekali.
Solusi yang Saya Gunakan
Solusi paling sederhana adalah mengubah domain menjadi satu level subdomain.
Dari:
monitor.service.mydomain.com
menjadi:
monitor.mydomain.com
Setelah DNS diubah dan Cloudflare menerbitkan certificate baru, aplikasi langsung bisa diakses dengan normal.
Tidak perlu mengubah konfigurasi tunnel, reverse proxy, atau container.
Alternatif Solusi Lain
Jika memang ingin tetap menggunakan subdomain bertingkat, ada beberapa opsi lain.
1. Mengaktifkan Total TLS
Cloudflare menyediakan fitur Total TLS yang dapat membuat certificate untuk semua hostname secara otomatis, termasuk subdomain bertingkat.
Namun fitur ini termasuk dalam add-on Advanced Certificate Manager, yang merupakan fitur berbayar.
2. Menggunakan Custom Certificate
Alternatif lainnya adalah mengunggah certificate sendiri, misalnya wildcard seperti:
*.service.mydomain.com
Namun ini juga biasanya digunakan pada plan berbayar.
Rekomendasi Struktur Domain untuk Self-Hosted Services
Jika menggunakan Cloudflare Free Plan, biasanya lebih praktis menggunakan pola seperti ini:
grafana.mydomain.com
monitor.mydomain.com
status.mydomain.com
pbx.mydomain.com
docker.mydomain.com
Selain lebih sederhana, pola ini juga menghindari masalah certificate coverage.
Kesimpulan
Jika kamu menemukan error seperti:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
dan menggunakan Cloudflare, jangan langsung fokus ke konfigurasi TLS.
Coba cek dulu apakah hostname yang digunakan tercakup oleh certificate Cloudflare.
Pada Free Plan, Cloudflare hanya menjamin certificate untuk:
mydomain.com
*.mydomain.com
Jika menggunakan subdomain bertingkat, kemungkinan besar domain tersebut tidak memiliki certificate di Cloudflare edge.
Solusi paling cepat biasanya hanya mengubah domain menjadi satu level subdomain.
