SNI (Server Name Indication), istemcinin TLS el sıkışmasının başında hangi ana bilgisayar adına bağlanmak istediğini bildirmesini sağlar. Böylece tek bir IP ve 443 portunda birden fazla alan adı, her biri kendi sertifikasıyla yayınlanabilir.
SNI olmadan ne olur?
Sunucu hangi siteye bağlanıldığını el sıkışma bitmeden bilemez. SNI yoksa varsayılan sanal konağın sertifikası sunulur ve istemci "ad uyuşmazlığı" hatası görür. Modern tarayıcılar ve güncel sistemler SNI'yi destekler; sorunlar çoğunlukla çok eski istemcilerde veya SNI göndermeyen araçlarda çıkar.
Nginx örneği
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/ssl/varsayilan.crt;
ssl_certificate_key /etc/ssl/varsayilan.key;
return 444;
}
server {
listen 443 ssl;
server_name site1.com www.site1.com;
ssl_certificate /etc/ssl/site1.crt;
ssl_certificate_key /etc/ssl/site1.key;
}
server {
listen 443 ssl;
server_name site2.com;
ssl_certificate /etc/ssl/site2.crt;
ssl_certificate_key /etc/ssl/site2.key;
}
Apache'de her site için ayrı VirtualHost *:443 ve ServerName yeterlidir; Apache 2.4 SNI'yi varsayılan destekler.
Test ve teşhis
openssl s_client -connect 203.0.113.10:443 -servername site1.com </dev/null | openssl x509 -noout -subject
openssl s_client -connect 203.0.113.10:443 </dev/null | openssl x509 -noout -subject
curl -v --resolve site1.com:443:203.0.113.10 https://site1.com/
İlk komut site1 sertifikasını, ikincisi (SNI'siz) varsayılan sertifikayı göstermelidir. Fark buysa SNI çalışıyor demektir.
Sık sorunlar
- Yanlış sertifika görünüyor:
server_nameveyaServerNameeşleşmiyor, varsayılan sunucu devreye giriyor. - IP ile bağlanınca uyarı: IP'ler SNI göndermez; beklenen davranıştır.
- CDN veya yük dengeleyicinin arkasında kaynak sunucuya SNI iletilmiyor (Nginx proxy kullanıyorsanız proxy_ssl_server_name on gerekebilir).
Sonucu SSL Checker ile doğrulayın. Çok alan adlı çözümler için SSL sertifikaları ve alt alan adlarını tek sertifikayla örtmek için Wildcard SSL seçeneklerine bakabilirsiniz.