SNI Nedir ve Aynı IP Adresinde Sertifika Nasıl Seçilir?

SNI (Server Name Indication), TLS bağlantısı başlatılırken istemcinin ulaşmak istediği DNS hostname’i sunucuya bildiren bir TLS uzantısıdır. Web istekleri ve yanıtları HTTP ile taşınır. Sunucu, HTTP isteği gelmeden önce SNI bilgisini kullanarak sertifikayı ve TLS yapılandırmasını seçebilir.
HTTPS, HTTP iletişimini TLS ile korur. Aynı IP adresi ve HTTPS portu birden fazla alan adına hizmet veriyorsa yalnız hedef IP adresine bakmak yeterli değildir. İstemci, TLS ClientHello iletisinde SNI değerini gönderdiğinde sunucu bu değeri yapılandırmasındaki ana makine adı eşlemesiyle karşılaştırır ve uygun sertifika zincirini seçer.
SNI sertifika üretmez, sertifikanın güvenilir olduğunu kanıtlamaz ve HTTP içeriğini tek başına seçmez. Görevi, TLS el sıkışmasının erken aşamasında hedef ana makine adı bilgisini ileterek sunucunun doğru sertifika ve TLS ayarlarını seçmesini sağlamaktır.
TLS El Sıkışmasında SNI Kullanımı
Bağlantı önce IP adresi ve port üzerinden kurulur. Bu aşamada aynı IP adresi ve port üzerinde birden fazla TLS sitesi bulunabilir; dolayısıyla sunucu yalnız bağlantının hedef IP adresinden hangi alan adının istendiğini çıkaramaz.
İstemci ilk TLS mesajı olan ClientHello içinde desteklediği TLS özellikleriyle birlikte SNI değerini gönderir. server_name uzantısındaki host_name değeri bir DNS ana makine adıdır; URL şeması, port veya yol içermez. Sunucu bu değeri bir TLS bağlamına eşler.
Seçilen TLS bağlamı, sertifika dosyasının yanı sıra başka ayarları da içerebilir. Yapılandırmaya bağlı olarak sertifika zinciri, özel anahtar, desteklenen protokol sürümleri, istemci sertifikası politikası ve HTTP/2 gibi uygulama protokollerinin seçilmesini sağlayan ALPN (Application-Layer Protocol Negotiation) tercihleri de ana makine adına göre ayrılabilir.
host_name değeri, sondaki nokta olmadan, ASCII karakter kodlamasıyla yazılmış tam DNS ana makine adını taşır; aynı ad türünden birden fazla değer gönderilemez. Uluslararasılaştırılmış alan adları (IDN) SNI içinde A-etiketi, yaygın adıyla Punycode biçiminde yer alır. IPv4 veya IPv6 adreslerinin kendileri host_name alanında kullanılamaz; IP adresiyle yapılan doğrudan test bu nedenle alan adıyla yapılan SNI testinin eş değeri değildir.
Sunucunun Sertifikayı Göndermesi
Sertifikayla kimlik doğrulaması yapılan tam bir TLS el sıkışmasında sunucu, seçtiği sertifikayı istemciye gönderir. İstemci daha sonra sertifikanın geçerlilik süresini, güven zincirini, imzasını ve ad kapsamını kontrol eder. Sertifikanın ad kapsamı hedef ana makine adını içermelidir; yalnız SNI değerinin doğru olması sertifikayı geçerli hale getirmez. Önceden paylaşılan anahtarın kullanıldığı oturum devam ettirme bağlantılarında ise sertifika yeniden gönderilmeyebilir.
Güncel alan adı doğrulamasında X.509 sertifikasındaki SAN (Subject Alternative Name) uzantısının dNSName değerleri kullanılır; eski CN (Common Name) alanı bunun yerine kullanılmaz. Bir sertifika birden fazla DNS adını kapsayabilir; bu durum SNI ile sertifika seçimini ortadan kaldırmaz, yalnız aynı sertifikanın birden fazla ad için geçerli olmasını sağlar. IP adresiyle doğrulama yapılacaksa sertifikanın SAN uzantısında karşılık gelen iPAddress değeri bulunmalıdır.
Wildcard sertifikadaki *.example.com gibi bir ad, sol taraftaki tek etiketi kapsayabilir; example.com kök adını veya a.b.example.com gibi birden fazla düzeyi kendiliğinden kapsamaz. Bu nedenle joker kapsamını, her ana makine adı için sertifika seçimini ve HTTP site eşlemesini ayrı ayrı doğrulayın.
Örneğin iki farklı alan adı aynı IP adresindeki 443 numaralı porta yönlenebilir. İstemci hangi alan adıyla bağlantı kuruyorsa SNI içinde o ana makine adını gönderir; sunucu her alan adı için farklı bir sertifika sunabilir.
SNI ile HTTP İsteğindeki Hedef Adın Farkı Nedir?
SNI ile HTTP isteğindeki hedef alan adı çoğu web isteğinde aynı ana makine adını gösterir, ancak bu bilgiler protokolün farklı aşamalarında kullanılır. SNI, TLS kurulmadan önce sertifika ve TLS bağlamı seçimini etkiler. HTTP isteğindeki hedef alan adı ise güvenli kanal kurulduktan sonra isteğin hangi siteye veya uygulamaya yöneltileceğini belirtir.
HTTP/1.1 bu amaçla Host başlığını kullanır. HTTP/2 ve HTTP/3 isteklerinde hedef genellikle :authority alanıyla belirtilir. Sunucu veya reverse proxy (ters proxy), TLS katmanında SNI'ye göre bir sertifika seçtikten sonra HTTP katmanında hedef alan adını ayrıca değerlendirir.
SNI ile HTTP hedef adının farklı olması tek başına hatalı bir istek olduğunu göstermez. HTTP/2 ve HTTP/3, uygun koşullarda bir bağlantının birden fazla alan adı için yeniden kullanılmasına izin verir. Bunun için sunucu yeni hedefe hizmet vermeye yetkili olmalı ve istemci, bağlantıda kullanılan sertifikanın yeni hedef adı için de geçerli olduğunu doğrulamalıdır. Sunucu ayrıca isteği kendi site eşlemeleri ve TLS politikalarıyla birlikte değerlendirmelidir. Hedefe bu bağlantı üzerinden hizmet veremiyorsa 421 Misdirected Request yanıtıyla isteği reddedebilir; yalnız SNI ve HTTP hedef adlarının birebir aynı olmasını zorunlu tutmak geçerli bağlantı paylaşımını da engelleyebilir.
SNI Gizliliği ve ECH
Klasik TLS el sıkışmasında, TLS 1.3 diğer birçok el sıkışma bilgisini şifrelese de SNI değeri ilk ClientHello içinde ağ üzerindeki gözlemciler tarafından görülebilir. ECH (Encrypted ClientHello), gerçek hedef adını ve diğer hassas uzantıları ClientHelloInner adlı iç mesajda şifrelemek için standartlaştırılmıştır. Dışarıda görülen ClientHelloOuter ise istemciye dönük ortak hizmet adına ve ECH yüküne sahiptir.
ECH kullanacak istemci, sunucunun açık anahtarını ve ilgili parametreleri içeren ECH yapılandırmasını bağlantıdan önce öğrenmelidir. Bu bilgi DNS içindeki SVCB (Service Binding) veya HTTPS kaynak kayıtlarının ech parametresiyle yayımlanabilir. İstemci ve sunucu ECH'yi destekliyor, güncel yapılandırma istemciye ulaşıyor ve ECH kabul ediliyorsa gerçek SNI iç mesajda korunur. ECH kullanılmadan başlatılan bağlantıda SNI açık olabilir; ancak başlatılmış bir ECH denemesinin reddedilmesi, gerçek adı hemen açık biçimde gönderme izni vermez. İstemci doğrulanmış yeni ayarlarla yeniden deneyebilir veya bağlantıyı sonlandırabilir. ECH'yi devre dışı bırakma kararı da protokolün kimlik doğrulama ve yeniden deneme kurallarına bağlıdır.
ECH, sertifika seçimi ve ad doğrulaması gereğini ortadan kaldırmaz. İstemciye dönük uç nokta iç mesajı çözdükten sonra gerçek SNI değerini uygun TLS bağlamına yönlendirir; istemci de sunulan sertifikanın hedef adı kapsadığını doğrular. ECH ayrıca DNS sorgusunu veya bütün trafik özelliklerini tek başına gizlemez; gizlilik sonucu DNS taşıması, istemci desteği, uç nokta yapılandırması ve aynı ECH kümesini paylaşan adların oluşturduğu gizlilik grubuna bağlıdır.
IP Tabanlı TLS ile SNI Arasındaki Farklar
IP tabanlı ayırmada TLS yapılandırması hedef IP adresi ve portla seçilir. Alan adına özgü yapılandırmaları bu yöntemle ayırmak için farklı IP adresleri veya portlar gerekir. Bu, her sertifika dosyasının ayrı bir IP adresi gerektirdiği anlamına gelmez; bir uç nokta istemcinin desteklediği algoritmaya göre farklı sertifikalar da sunabilir. SNI ise aynı IP adresi ve port üzerindeki bağlantıları istemcinin bildirdiği ana makine adına göre ayırır.
| Özellik | SNI ile seçim | IP tabanlı ayırma |
|---|---|---|
| Seçim anahtarı | ClientHello içindeki ana makine adı | Hedef IP adresi ve port |
| IP adresi ihtiyacı | Bir IP adresi üzerinde birden fazla sertifika kullanılabilir | Aynı portta, alan adına özgü ayrı TLS yapılandırmaları farklı IP adresleriyle ayrılır |
| İstemci gereksinimi | İstemcinin SNI göndermesi gerekir | Ana makine adı bilgisinin TLS seçiminde gönderilmesi gerekmez |
| Eşleşme bulunamazsa | Varsayılan sertifika sunulabilir veya bağlantı sonlandırılabilir | IP adresine bağlı sertifika seçilir |
| Yönetim sonucu | IP adresleri daha verimli paylaşılabilir | Sertifika ayrımı daha fazla adres planlaması gerektirir |
Güncel web barındırma düzenlerinde SNI yaygın olarak kullanılır; yine de ayrı IP adresi kullanımı tamamen ortadan kalkmış değildir. SNI göndermeyen eski veya özel istemciler, işletimsel yalıtım ya da kurum politikaları ayrı IP adresi gerektirebilir. Ekip, desteklemesi gereken eski istemci sürümlerinin SNI uyumluluğunu güncel üretici belgelerinden kontrol etmelidir.
Aynı IP Adresinde Birden Fazla Sertifikayı Yapılandırma
Her ana makine adını onu kapsayan sertifika ve TLS bağlamıyla eşleştirin. Kullanılan ürüne göre menüler ve yapılandırma sözdizimi değişir.
- Ana makine adı envanterini çıkarın. Aynı IP adresi ve portta hizmet verecek alan adlarını, alt alan adlarını ve varsa takma adları belirleyin.
- Sertifika kapsamını kontrol edin. Her ana makine adı ilgili sertifikanın SAN uzantısındaki
dNSNamedeğerlerinden biriyle kapsanmalıdır. Joker veya çok alan adlı sertifika kullanılıyorsa kapsanan adların sınırlarını ayrıca doğrulayın. - TLS eşlemesini tanımlayın. Web sunucusu, yük dengeleyici, CDN veya ters proxy üzerinde her SNI adı için doğru sertifika zincirini ve özel anahtarı seçin.
- Varsayılan davranışı belirleyin. SNI göndermeyen veya tanınmayan bir ad gönderen istemciye hangi sertifikanın sunulacağını ya da bağlantının sonlandırılıp sonlandırılmayacağını açıkça yapılandırın.
- HTTP hedef eşlemesini uyumlu tutun. SNI için tanımlanan ana makine adını HTTP katmanında doğru site veya uygulamayla eşleştirin.
- Alan adı üzerinden doğrulayın. Kontrolü yalnız IP adresiyle değil gerçek ana makine adı üzerinden yapın; sunulan sertifikayı, zinciri ve ad eşleşmesini inceleyin.
TLS sonlandırması bir CDN veya ters proxy üzerinde yapılıyorsa kullanıcıya sunulan sertifikayı o uç nokta seçer. Arka uç sunucudaki sertifika seçimi ayrı bir TLS bağlantısının konusu olabilir; bu nedenle yapılan kontrolün kullanıcı ile CDN arasındaki bağlantıyı mı, yoksa CDN ile kaynak sunucu arasındaki bağlantıyı mı denetlediği açık olmalıdır.
SNI ve Sertifika Seçimi Nasıl Test Edilir?
Testi gerçek alan adıyla yapmak, IP adresine doğrudan bağlanıp varsayılan sertifikayı görmekten farklıdır. OpenSSL istemcisinde -servername seçeneği SNI adını, -verify_hostname ise sertifika ad doğrulamasını belirler. -verify_return_error, sertifika doğrulama hatasında bağlantıyı keser; bu seçenek olmadan OpenSSL hatayı gösterip bağlantıyı sürdürebilir. Aşağıdaki belgeleme için ayrılmış IP adresini ve www.example.com adını kendi hedefinizle değiştirin.
openssl s_client -connect 192.0.2.10:443 -servername www.example.com -verify_hostname www.example.com -verify_return_error -showcertsBu komut TLS el sıkışmasını ve sunucunun gönderdiği sertifikaları gösterir; tek başına normal bir HTTP sayfa isteği üretmez. Doğrulama için OpenSSL'in uygun güvenilir kök sertifikalara erişmesi gerekir. Özel bir sertifika yetkilisi kullanıyorsanız onun güvenilir kökünü ayrıca tanımlayın; doğrulamayı kapatmayın. Hem TLS SNI değerini hem de HTTP hedefini aynı adla sınamak için curl --resolve kullanılabilir. Bu seçenek DNS sonucunu yalnız komut için değiştirir; URL'deki alan adı korunduğundan sertifika doğrulaması ve HTTP Host ya da :authority değeri de o ad üzerinden yürür.
curl -v --resolve www.example.com:443:192.0.2.10 https://www.example.com/SNI göndermeyen istemcilerin davranışını denemek için OpenSSL komutunda -servername ve değerini kaldırıp -noservername kullanın; sertifika adı doğrulamasını koruyun. Yalnız -servername seçeneğini atlamak her zaman SNI'yi kapatmaz: -connect içinde alan adı varsa OpenSSL bu adı otomatik kullanabilir. Bu örnekler klasik SNI ve sertifika seçimini sınar; ECH gizliliğini test etmez.
Test çıktısında sunulan yaprak sertifikayı, ara sertifikaları, SAN kapsamını, doğrulama sonucunu ve bağlanılan gerçek IP adresini birlikte kaydedin. CDN veya ters proxy kullanılan mimaride kullanıcı uç noktasını ve kaynak sunucu bağlantısını ayrı komutlarla sınayın; bir katmanın doğru sertifika sunması diğer katmanın da doğru yapılandırıldığı anlamına gelmez.
Yanlış Sertifika Sunulmasının Yaygın Nedenleri
- Ana makine adı için SNI eşlemesinin hiç tanımlanmaması veya yanlış TLS bağlamına bağlanması.
- SNI göndermeyen istemcilere sunulan varsayılan sertifikanın beklenmeyen bir alan adına ait olması.
- Sertifikanın ilgili ana makine adını SAN uzantısında kapsamaması.
- CDN, yük dengeleyici veya kaynak sunucu katmanlarından birinde hedef adı kapsamayan ya da eski sertifikanın kalması.
- DNS değişikliği sonrasında trafiğin eski ya da farklı bir TLS uç noktasına gitmesi.
- HTTP site kaydı ile TLS SNI kaydının aynı ana makine adı için farklı hedeflere bağlanması.







