Bu konu, ilgili web hizmetleri Web Application Firewall (WAF) üzerine eklendikten sonra istemciler arasındaki Server Name Indication (SNI) uyumluluk sorunlarından kaynaklanan HTTPS erişim istisnalarının nasıl çözüleceğini açıklar.
Arka plan
Sanal barındırma, IP adresi kıtlığı sorununu ele almak için tanıtılmıştır. Sanal barındırma, tek bir HTTP veya HTTPS sunucusunun aynı IP adresini paylaşarak birden çok alan adını barındırmasına olanak tanır. Bu durumda her alan adı bir sanal ana bilgisayar görevi görür. Sunucu, istemci isteklerinde taşınan Host üst bilgilerine göre istekleri farklı sanal ana bilgisayarlara yönlendirebilir. Örneğin, bir tarayıcı sanal barındırmanın etkin olduğu bir web sunucusunda barındırılan bir HTTPS sitesine erişmeden önce sunucuyla bir SSL bağlantısı kurmalı ve gerekli sunucu sertifikasını istemelidir. Ancak sunucu hangi alan adına erişildiğini belirleyemez ve gerekli sertifikayı döndüremez.
SNI, bu sorunu çözmek için tasarlanmış bir SSL/TLS uzantısıdır. Sunucuyla bir SSL bağlantısı kurulmadan önce tarayıcı, erişilecek alan adını belirten ana makine adını sunucuya gönderir. Ardından sunucu alan adını tanımlar ve buna karşılık gelen sertifikayı döndürür.
Çoğu işletim sistemi ve tarayıcı SNI'yi destekler. OpenSSL 0.9.8 yerleşik SNI desteği sunar. NGINX sunucularının yeni sürümleri de SNI'yi destekler.
Sorun açıklaması
Web siteniz WAF'a eklendikten sonra HTTPS erişim istisnalarıyla karşılaşıyorsa ilgili istemciler SNI'yi desteklemiyor olabilir.
SNI'yi desteklemeyen bir tarayıcı kullanılarak WAF korumalı bir web sitesine erişildiğinde WAF istenen belirli alan adını tanımlayamaz veya tarayıcıyla etkileşim kurmak için gereken sertifikayı elde edemez. Bu durumda WAF, tarayıcıyla el sıkışma sürecini tamamlamak için varsayılan sertifikayı kullanır ve tarayıcı "Certificate not trusted" hatasını bildirir.
Bir istemci SNI'yi desteklemiyorsa aşağıdaki sorunlar oluşabilir:
İstemci iOS üzerinde çalışan bir mobil uygulama ise erişim başarılı olur. İstemci Android üzerinde çalışan bir mobil uygulama ise erişim başarısız olur.
İstemci bir tarayıcı ise "Certificate not trusted" hatası bildirilir.
Çözüm
İstemcinin SNI'yi destekleyip desteklemediğini belirlemek için istemci tarafında SSL el sıkışma paketlerini yakalayın. Bu örnekte Alibaba Cloud'un resmi web sitesine erişmek için Chrome tarayıcısı kullanılmaktadır.
Client Hello paketinde SNI bilgisi varsa istemci SNI'yi destekler.
Aksi takdirde istemci SNI'yi desteklemez. Öneriler:
Tarayıcınızı yükseltin veya Chrome ve Firefox gibi en son sürüm tarayıcıyı kullanın.
WeChat veya Alipay geri araması gibi üçüncü taraf geri arama senaryolarında WAF'ı atlamak için kaynak sunucunun IP adresini kullanın.
SNI uyumluluğu
SNI, TLS1.0 ve sonraki sürümlerle uyumludur ancak SSL tarafından desteklenmez.
-
SNI aşağıdaki masaüstü tarayıcıları destekler:
Chrome 5 ve sonraki sürümler
Chrome 6 ve sonraki sürümler (Windows XP)
Firefox 2 ve sonraki sürümler
IE 7 ve sonraki sürümler (Windows Vista/Server 2008 ve sonraki sürümlerde; Windows XP'deki herhangi bir IE sürümü hariç)
Konqueror 4.7 ve sonraki sürümler
Opera 8 ve sonraki sürümler
Windows Vista/Server 2008 ve sonraki sürümlerde veya Mac OS X 10.5.6 ve sonraki sürümlerde Safari 3.0
-
SNI aşağıdaki kitaplıkları destekler:
GNU TLS
Java 7 ve sonraki sürümler (yalnızca istemci olarak)
HTTP client 4.3.2 ve sonraki sürümler
libcurl 7.18.1 ve sonraki sürümler
NSS 3.1.1 ve sonraki sürümler
OpenSSL 0.9.8j ve sonraki sürümler
OpenSSL 0.9.8f ve sonraki sürümler (bayraklar gerekli)
QT 4.8 ve sonraki sürümler
Python3, Python 2.7.9 ve sonraki sürümler
-
SNI aşağıdaki mobil tarayıcıları destekler:
3.0 Honeycomb ve sonraki sürümlerde Android Browser
iOS 4 ve sonraki sürümlerde iOS Safari
Windows Phone 7 ve sonraki sürümler
-
SNI aşağıdaki sunucuları destekler:
Apache 2.2.12 ve sonraki sürümler
Apache Traffic Server 3.2.0 ve sonraki sürümler
HAProxy 1.5 ve sonraki sürümler
IIS 8.0 ve sonraki sürümler
lighttpd 1.4.24 ve sonraki sürümler
LiteSpeed 4.1 ve sonraki sürümler
Nginx 0.5.32 ve sonraki sürümler
-
SNI aşağıdaki komut satırı arabirimlerini destekler:
cURL 7.18.1 ve sonraki sürümler
wget 1.14 ve sonraki sürümler