SNI (Server Name Indication), istemcinin TLS el sıkışması başında bağlanmak istediği alan adını sunucuya bildirmesini sağlayan bir TLS uzantısıdır. Sayesinde tek bir IP adresi ve 443 portu üzerinde, her biri kendi sertifikasına sahip birçok HTTPS sitesi barındırılabilir.
Neden gerekli?
HTTP'deki Host başlığı, şifreli kanal kurulduktan sonra gönderilir. Oysa sunucunun hangi sertifikayı sunacağını el sıkışma sırasında bilmesi gerekir. SNI, alan adını ClientHello içinde (şifrelenmeden) taşıyarak bu sorunu çözer.
Sunucu yapılandırması
# Nginx: her server bloğu kendi sertifikasını kullanır
server {
listen 443 ssl;
server_name site1.example.com;
ssl_certificate /etc/ssl/site1.crt;
ssl_certificate_key /etc/ssl/site1.key;
}
server {
listen 443 ssl;
server_name site2.example.com;
ssl_certificate /etc/ssl/site2.crt;
ssl_certificate_key /etc/ssl/site2.key;
}
Apache'de aynı mantık, her biri kendi ServerName ve SSLCertificateFile değerine sahip <VirtualHost *:443> blokları ile kurulur. IIS'te site bağlamasında "Require Server Name Indication" seçeneği vardır.
Test etme
openssl s_client -connect 203.0.113.10:443 -servername site2.example.com < /dev/null | openssl x509 -noout -subject -ext subjectAltName
curl -v --resolve site2.example.com:443:203.0.113.10 https://site2.example.com/
-servername olmadan bağlanırsanız sunucu varsayılan sertifikayı döndürür; bu, çoğu "yanlış sertifika geliyor" şikâyetinin nedenidir.
Sık sorunlar
- SNI göndermeyen çok eski istemciler varsayılan sertifikayı görür.
- Yük dengeleyici veya CDN arkasında SNI'nin arka uca doğru iletildiğinden emin olun.
- Alan adı doğrudan IP ile açılırsa SNI gönderilmez.
- SNI düz metin gittiği için ziyaret edilen alan adı ağda görülebilir; bunu gizlemeye yönelik ECH uzantısı geliştirilmektedir ancak yaygınlığı altyapıya bağlıdır.
Çoklu alan adı için Wildcard SSL seçeneğini, sonuçları doğrulamak için SSL denetleme aracını değerlendirebilirsiniz.