Backend'e bağlanırken SNI göndermem gerekiyor; nasıl ayarlarım?
Kısa cevap
Kurum Servisinde SSL Service açıkken SNI alanı doldurulur: alanın fx butonuyla Request HTTP header content değişkeni (Header Name = Host) eklenirse her istekte istemcinin istediği ad, sabit bir alan adı yazılırsa her bağlantıda aynı ad gönderilir. Değer her istekte HTTP isteğinden hesaplandığı için alan HTTP vService'lerde uygulanır. Alan boş bırakılırsa SNI gönderilmez; varsayılan budur. Certificate Verification = Required ile birlikte kullanıldığında sunucu sertifikasındaki ad SNI değerine göre denetlenir. WEB-CLI'da aynı alan --sni ile yazılır.
Sorun: Sunucu Birden Fazla Siteyi Aynı IP'de Barındırıyor
IIS, nginx ya da bulut hizmetleri gibi aynı IP'de birden fazla HTTPS sitesi barındıran sunucular, hangi sitenin istendiğini TLS el sıkışmasındaki SNI'dan anlar. TR7 bu sunuculara SNI göndermeden bağlanırsa sunucu varsayılan sertifikasını ya da varsayılan sitesini döndürür; IIS'te Require Server Name Indication açıksa ya da ADFS gibi SNI zorunlu servislerde bağlantı hiç kurulmaz.
Çözüm: İki Yöntem
| Durumunuz | Uygun yöntem |
|---|---|
| Arayüzden; her isteğin kendi adı gitsin ya da tek bir sabit ad yeterli | Yöntem 1: SNI alanı |
| Komut satırından | Yöntem 2: WEB-CLI |
Yöntem 1: SNI Alanı Önerilen
- Nasıl çalışır TR7, Kurum Servisine kurduğu TLS bağlantısının ClientHello mesajına SNI alanındaki değeri yazar. Değer fx ile eklenen bir değişkense her istekte yeniden hesaplanır.
- Nerede açılırLoad Balancer → Backend Services → Edit → SSL Service → SNI
- Gereksinim Kurum Servisinde SSL Service açık; sunucuda TLS dinleyen port
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Backend Services ekranında Kurum Servisi seçilip Edit tıklanır. Ayar bir Backend Group'taki bütün sunuculara ortak verilecekse Load Balancer → Backend Groups ekranında grup düzenlenir.
SSL Service açık olmalıdır; SNI alanı ancak o zaman görünür (SSL bridging nedir; backend'e giden trafiği de nasıl şifrelerim?).
İstemcinin istediği adın gönderilmesi için SNI alanının yanındaki fx butonuna tıklanır; pencere Request HTTP header content değişkeni ve Header Name = Host ile açılır, Submit tıklanır ve alanda ↓H rozeti görünür. Sunucu tek bir adla çalışıyorsa alana bu ad sabit olarak yazılır (ör. portal.example.com).
Formun altındaki Edit tıklanır; ayar Kurum Servisini kullanan bütün vService'lere uygulanır. Cluster kurulumunda varsayılan auto-sync ile değişiklik eş cihaza da gönderilir; Manual Sync Mode açıksa eş cihaza elle gönderilir.
Doğrulama
Sunucuda TR7'den gelen bağlantının ClientHello mesajı yakalanır; SNI şifresiz olduğundan ad okunabilir.
Komut: tcpdump -nn -A -s0 -i any tcp port 443 | grep -a portal.example.com
İstenen alan adı ClientHello'da görünür · doğru site yanıt verirYöntem 2: WEB-CLI
- Nasıl çalışır SNI alanı komut satırından yazılır.
--sniyalnızca--sslService trueile kullanılabildiğinden iki alan aynı komutta yazılır. - Nerede açılır TR7 WEB-CLI →
lb backend update - Gereksinim WEB-CLI erişimi; sunucuda TLS dinleyen port
- vService tipi HTTP
Adım adım yapılandırma
<kimlik> yerine Kurum Servisi Tab ile seçilir (SSL alanları); komut SSL Service'i de açık tuttuğundan yalnızca TLS dinleyen sunucularda kullanılır:
lb backend update id <kimlik> --sslService true --sni portal.example.comHer isteğin kendi adının gitmesi için arayüzdeki fx seçiminin karşılığı olan değişken tek tırnak içinde yazılır:
lb backend update id <kimlik> --sslService true --sni '%REQHEADER(Host)'Doğrulama
Komut: lb backend show <kimlik>
sslService true · sni portal.example.comSık Yapılan Hatalar
- SNI alanını boş bırakmak. SNI gönderilmez ve form uyarı vermez; SNI isteyen sunucuda varsayılan site ya da bağlantı hatası görülür.
- SSL Service kapalıyken SNI beklemek. SNI yalnızca TR7'nin Kurum Servisine TLS ile bağlandığı durumda gönderilir; SSL Service kapalıyken alan formda görünmez.
- L7 TCP vService'te Host başlığı değişkenini kullanmak. L7 TCP vService HTTP başlıklarını okumaz; bu alan HTTP vService'lerde uygulanır.
- SNI'nin sertifika doğrulamasıyla ilişkisini gözden kaçırmak. Certificate Verification = Required ile birlikte kullanıldığında sunucu sertifikasındaki ad SNI değerine göre denetlenir; SNI'ye sertifikada bulunmayan bir ad yazılırsa bağlantı kurulmaz (Backend'e HTTPS ile bağlanırken backend sertifikasını doğrulayabilir miyim?).
Dokümantasyonda nasıl yapılır
