İçeriğe geç

HSTS ve HSTS preload listesi

Derinlemesine rehber. Güncellendi .

Strict-Transport-Security nasıl çalışır, max-age güvenle nasıl artırılır, includeSubDomains neyi bozabilir, preload neyi gerektirir ve hangi riskleri taşır.

Neden tek başına HTTPS yetmez

Ziyaretçilerin çoğu bir siteye adını yazarak ya da http:// ile başlayan eski bir bağlantıyı izleyerek ulaşır. Sunucu bu isteği HTTPS'e yönlendirir, ama düşman bir ağda o ilk şifresiz istek araya girilerek yakalanabilir. Aradaki saldırgan kurbanı HTTP üzerinde tutup gerçek siteyi kendi üzerinden aktarabilir; SSL stripping adı verilen bu teknik, kullanıcı adres çubuğundaki kilidin eksikliğini fark etmediği sürece sessizce çalışır. Yönlendirmenin kendisi bu boşluğu kapatmaz, çünkü saldırgan yönlendirmeyi kullanıcıya hiç göstermeden düşürebilir.

HTTP Strict Transport Security (RFC 6797) bu boşluğu geri dönen ziyaretçiler için kapatır. Bir tarayıcı geçerli bir HTTPS bağlantısı üzerinden Strict-Transport-Security başlığını bir kez gördükten sonra, o ana bilgisayara giden sonraki her isteği daha ağa çıkmadan, kendi içinde HTTPS'e çevirir. Ayrıca o ana bilgisayar için sertifika hatalarında kullanıcının uyarıyı tıklayıp geçmesine izin vermez. Politika yalnızca başlığı gönderen adı kapsar ve max-age süresi boyunca hatırlanır; başlığı taşıyan her yeni yanıt bu süreyi baştan başlatır.

HSTS ile ilk ziyaret ve sonraki ziyaretlerİlk HTTPS ziyaretinde tarayıcı HSTS politikasını saklar; sonraki http:// istekleri tarayıcının içinde HTTPS'e yükseltilir ve max-age dolana kadar sertifika hataları ölümcül hale gelir.İlk ziyaret: https://example.comYanıt Strict-Transport-Security:max-age=31536000 başlığını içerirTarayıcı politikayı saklarexample.com ana bilgisayarı bir yıl boyuncaHTTPS kullanmak zorundadırSonrası: kullanıcı http://example.comyazarTarayıcı hiçbir şey göndermeden önce https://adresine yükseltirSertifika sorunu mu var?Bağlantı başarısız olur, devam etme seçeneğisunulmazPreload listesindeki alan adlarıPolitika tarayıcıyla birlikte gelir, böyleceilk ziyaret bile korunur
İlk HTTPS ziyaretinde tarayıcı HSTS politikasını saklar; sonraki http:// istekleri tarayıcının içinde HTTPS'e yükseltilir ve max-age dolana kadar sertifika hataları ölümcül hale gelir.

Başlık

HSTS başlığı
Strict-Transport-Security: max-age=31536000; includeSubDomains
HSTS direktifleri
DirektifAnlamı
max-age=<seconds>Tarayıcının politikayı ne kadar süre hatırlayacağı; başlığı taşıyan her yanıtta süre yeniden başlar. 0 politikayı kaldırır.
includeSubDomainsPolitikayı ana bilgisayarın bütün alt alan adlarına da uygular.
preloadRFC 6797'nin parçası değildir; tarayıcı preload listelerine alınmaya rıza gösterdiğinizi bildirir.

Tarayıcılar başlık düz HTTP üzerinden geldiğinde onu yok sayar, çünkü saldırgan orada kendi başlığını enjekte edebilir. Bu yüzden başlığı yalnızca HTTPS yanıtlarında gönderin ve yönlendirmeler ile hata sayfaları dâhil her yanıta ekleyin; böylece ziyaretçi hangi sayfaya düşerse düşsün politika tazelenir. Direktifleri noktalı virgülle ayırın ve aynı yanıtta başlığı yalnızca bir kez gönderin, çünkü tarayıcılar geçerli olan ilk başlığı kullanıp gerisini yok sayar. Değerin etrafına tırnak koymak da gerekmez; nginx ve Apache örneklerindeki tırnaklar yapılandırma söz dizimine aittir, başlığın kendisine değil.

nginx
server {
    listen 443 ssl;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}
Apache httpd
<VirtualHost *:443>
    ServerName example.com
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

always anahtar sözcüğü önemlidir

nginx'te always olmadan yazılan add_header, 404 veya 500 gibi hata yanıtlarında atlanır; ayrıca bir location bloğunda ayarlanan başlık, server düzeyinde ayarlanan başlıkların yerine geçer. Yalnızca yapılandırmaya değil, gerçek yanıtlara bakarak kontrol edin.

HSTS'i güvenle yayına almak

HSTS'in riski başlığın kendisi değil, hafızasıdır. Bir yıllık bir politika yayımlar ve sonra o ana bilgisayarda düz HTTP'ye ihtiyaç duyarsanız ya da sertifikanın süresi dolarsa, başlığı görmüş tarayıcılar politika sona erene kadar bağlanmayı reddeder. Aşamalı bir yayına alma bu sorunları max-age hâlâ kısayken ortaya çıkarır ve geri dönüşü birkaç dakikalık bir işe indirir.

Aşamalı bir max-age planı
AşamaBaşlıkSonraki aşamadan önce bekleme
1. Testmax-age=300Bir gün; siteyi ve temel akışları kontrol edin
2. Kısamax-age=86400Bir hafta; hataları ve destek taleplerini izleyin
3. Alt alan adlarımax-age=86400; includeSubDomainsHer alt alan adını kontrol ettikten sonra bir hafta
4. Bir aymax-age=2592000; includeSubDomainsBir ay
5. Bir yılmax-age=31536000; includeSubDomainsUzun vade; preload'ı değerlendirin

Üçüncü adımdan önce DNS'te var olan bütün alt alan adlarını listeleyin ve her birinin geçerli bir sertifikayla HTTPS üzerinden çalıştığını doğrulayın. DNS Sorgulama aracı ve DNS bölge dışa aktarımınız iyi bir başlangıç noktasıdır; yazıcıları, eski intranet adlarını ve yalnızca şirket içindeki insanların kullandığı hazırlık sunucularını unutmayın. Listeyi yalnızca bölge dosyasından çıkarmak çoğu zaman yetmez: joker kayıtların arkasında duran adlar ve başka ekiplerin kendi panellerinden açtığı alt alan adları orada görünmez.

Her aşamayı alt alan adlarını işleten ekiplere duyurun. Tarihi ve planlanan max-age değerini içeren kısa bir not, onlara yalnızca HTTP ile çalışan bir hizmeti bozulmadan önce HTTPS'e taşıma fırsatı verir. Bu duyuruyu yazılı bir yerde saklamak, aylar sonra bunu kimin ne zaman açtığı sorusunu da ortadan kaldırır.

Başlığın gerçek yanıtlarınızda göründüğünü HTTP Başlık Denetleyicisi ile kontrol edin. Araç max-age değerini gün cinsinden gösterir, includeSubDomains ve preload direktiflerinin var olup olmadığını da söyler. Kontrolü ana sayfanın yanı sıra bir alt sayfada, bir 404 yanıtında ve yönlendirme yapan çıplak alan adında da yineleyin; eksik başlıklar genellikle tam olarak bu üç yerde ortaya çıkar.

includeSubDomains neyi bozabilir

example.com üzerinde ayarlanan includeSubDomains, başka ekiplerin ya da tedarikçilerin sunduğu adlar dâhil altındaki her ada uygulanır. Hâlâ düz HTTP üzerinden erişilmesi gereken her alt alan adı, politikayı almış tarayıcılar için erişilemez hale gelir. Tipik kurbanlar iç araçlar, kendinden imzalı sertifikaya sahip ağ cihazları ve eski pazarlama mikro siteleridir. Bu adların çoğu sizin envanterinizde görünmediği için sorun genellikle yayına aldıktan günler sonra ortaya çıkar.

  • Ofis ağı içinde HTTP üzerinden sunulan intranet.example.com gibi iç sunucular.
  • Kendinden imzalı sertifikaya sahip cihazlar; çünkü HSTS uyarıyı tıklayıp geçme seçeneğini kaldırır.
  • Sertifikasını sizin denetlemediğiniz, tedarikçide barındırılan alt alan adları (yardım merkezleri, durum sayfaları).
  • Eski istemcilerin kullandığı alt alan adlarındaki captive portal'lar veya yalnızca HTTP ile çalışan API'ler.

Başlık yalnızca onu gönderen ana bilgisayar ve o adın alt alan adları için geçerlidir. www.example.com tarafından includeSubDomains ile gönderilen bir politika *.www.example.com adlarını kapsar, api.example.com adresini kapsamaz. Alan adının tamamını kapsamak için başlığın example.com adresinin kendisi tarafından gönderilmesi gerekir; bu da kullanıcıların çıplak alan adını en az bir kez ziyaret etmesini ya da alan adının preload listesinde olmasını gerektirir. Çıplak alan adı yalnızca www adresine yönlendirme yapıyor olsa bile, o yönlendirme yanıtının başlığı taşıması bu yüzden önemlidir.

Preload listesi

HSTS bir tarayıcıyı ancak ilk başarılı HTTPS ziyaretinden sonra korur. Preload listesi bu ilk ziyaret boşluğunu ortadan kaldırır: Chromium'un içine derlenen ve Firefox, Safari ile Edge tarafından da kullanılan bu liste, üzerindeki alan adlarını en baştan HSTS kapsamındaymış gibi ele alır. Alan adları hstspreload.org üzerinden gönderilir; site gereksinimleri otomatik olarak kontrol eder ve eksik varsa başvuruyu kabul etmez. Kabul edilen bir alan adının kullanıcılara ulaşması yine de haftalar alır, çünkü liste ancak yeni tarayıcı sürümleriyle birlikte dağıtılır.

Preload gereksinimleri (hstspreload.org üzerinde yayımlandığı biçimiyle)
GereksinimPratikte ne anlama geliyor
Geçerli sertifikaÇıplak alan adı, güvenilen bir sertifikayla HTTPS sunar
HTTP'yi HTTPS'e yönlendirin80 numaralı port açıksa http://example.com önce aynı ana bilgisayardaki HTTPS adresine yönlenir
Bütün alt alan adları HTTPS üzerindeDNS'te varsa www dâhil
Çıplak alan adında HSTS başlığıEn az 31536000 değerinde max-age, ayrıca includeSubDomains ve preload
Yönlendirmelerde de başlıkÇıplak alan adından yapılan HTTPS yönlendirmesi de başlığı göndermeyi sürdürmelidir
Preload'a uygun başlık
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

Listeden çıkmak yavaştır

Bir alan adını preload listesinden kaldırma isteği de aynı site üzerinden yapılır, ama bu değişiklik kullanıcılara ancak tarayıcılar yeni sürüm yayımladıkça ve kullanıcılar güncelledikçe ulaşır. Aylarla planlayın. Preload'ı yalnızca bugünkü ve gelecekteki her alt alan adının yalnızca HTTPS ile çalışacağından eminseniz açın.

Bazı üst seviye alan adları bütünüyle preload listesindedir; bu yüzden altlarında kayıtlı her alan adı tarayıcılarda daha ilk ziyaretten itibaren HTTPS ister. Böyle bir TLD kullanıyorsanız HSTS davranışı sizin başlığınızdan bağımsız olarak zaten yürürlüktedir ve düz HTTP ile çalışan alt alan adları hiç açılmaz. Bu durumda başlığı yine de gönderin: kendi politikanız, TLD kuralını uygulamayan eski tarayıcıları da kapsar.

HSTS ile uyumlu yönlendirmeler

Temiz bir yönlendirme zinciri hem HSTS hem de preload için önemlidir. Önerilen sıra şudur: http://example.comhttps://example.com (çıplak alan adı için HSTS'i ayarlar) → www kullanıyorsanız https://www.example.com. http://example.com adresinden doğrudan https://www.example.com adresine yönlendirmek, çıplak alan adının HTTPS yanıtını atlar; dolayısıyla o ad kendi politikasını hiçbir zaman göndermez.

Preload ile uyumlu bir yönlendirme zinciri
http://example.com/        301 → https://example.com/
https://example.com/       301 → https://www.example.com/   (with Strict-Transport-Security)
http://www.example.com/    301 → https://www.example.com/
https://www.example.com/   200                               (with Strict-Transport-Security)

Yönlendirme Denetleyicisi zinciri http:// adresinden başlayarak izler ve her adımı listeler; böylece ilk adımın aynı ana bilgisayarda kaldığını doğrulamak kolaylaşır. Her adımda başlığın da göründüğünü kontrol edin; yönlendirme yanıtlarına başlık eklemeyi unutmak, preload başvurularının en sık reddedilme nedenlerinden biridir. Yönlendirme rehberi döngüleri ve gereksiz adımları ayrıntılı anlatır.

Sık yapılan hatalar

HSTS hataları ve etkileri
HataEtkisiÇözüm
Başlığın yalnızca ana sayfada olmasıBaşka bir sayfaya düşen ziyaretçiler politikayı hiç almazBaşlığı her HTTPS yanıtında gönderin
301 veya hata yanıtlarında başlığın eksik olmasıYalnızca yönlendirme yapan ana bilgisayarlar politikayı hiç ayarlamaznginx'te always, Apache'de Header always set kullanın
İlk günden bir yıllık max-ageHatalar tarayıcılarda bir yıl boyunca önbellekte kalırmax-age değerini aşamalı olarak artırın
includeSubDomains yalnızca www üzerindeÇıplak alan adı ve diğer alt alan adları kapsanmazBaşlığı çıplak alan adından gönderin
Gönderim yapmadan preload eklemekEtkisi yoktur, ama preload'a rıza gösterdiğinizi bildirirPreload niyetiniz yoksa kaldırın
Uygulamadan ve proxy'den iki farklı başlıkTarayıcılar geçerli olan ilkini kullanırBaşlığı tek bir katmanda ayarlayın

Son satır CDN ve ters proxy arkasında sık görülür: uygulama bir değer gönderir, kenar sunucusu başka bir değer ekler. Güvenlik başlıklarının hangi katmana ait olduğuna karar verin, diğerini kaldırın ve nihai yanıtı dışarıdan HTTP Başlık Denetleyicisi ile doğrulayın. Kararı altyapı deposunda kısa bir notla belgeleyin; aksi halde aynı çift başlık, bir sonraki CDN yapılandırmasında geri gelir.

Tarayıcıları HTTPS'e yönelten başka ve daha yeni özellikler de var; bunların HSTS ile ilişkisini bilmek işinizi kolaylaştırır. Hiçbiri sizin yönettiğiniz bir sitede HSTS'in yerini tutmaz, ama HSTS kullanmayan sitelerde ziyaretçilerin gördüğü davranışı değiştirirler. Aralarındaki en önemli fark kimin karar verdiğidir: bazılarını siz ayarlarsınız, bazıları ise kullanıcının tarayıcı tercihine bağlıdır ve sizin denetiminizde hiç değildir.

Bağlantıları HTTPS'e yükselten mekanizmalar
MekanizmaKim ayarlarKapsam
HSTS başlığı (RFC 6797)Sizin sunucunuzKendi ana bilgisayarınız, isteğe bağlı olarak alt alan adları; max-age boyunca hatırlanır
HSTS preload listesiTarayıcı üreticileri, sizin talebiniz üzerineAlan adınız ve bütün alt alan adları, daha ilk ziyaretten önce
HTTPS DNS kayıtları (RFC 9460)Sizin DNS'inizDestekleyen tarayıcılar doğrudan HTTPS üzerinden bağlanabilir
Tarayıcının HTTPS-first veya HTTPS-only kipleriKullanıcı veya tarayıcıBütün siteler; HTTPS başarısız olduğunda uyarı gösterilir
upgrade-insecure-requests (CSP)Sizin sunucunuzSayfalarınızın içindeki alt kaynaklar; sitenize yapılan gezinme değil

HSTS, sertifika hatalarını atlanamaz hale getiren ve geri dönen ziyaretçileri onu uygulayan her tarayıcıda koruyan, sizin denetiminizdeki mekanizma olmayı sürdürüyor. Diğerleri yararlı eklerdir; özellikle upgrade-insecure-requests, eski içeriği temizlerken HSTS ile iyi bir ikili oluşturur.

HSTS ile yaşamak

HSTS, sertifika sorunlarını kesintiye dönüştürür. Yenilemeyi otomatikleştirin, süre bitimini ayrıca izleyin ve yenilemeleri hazırlık sunucularında test edin. HSTS kullanmayan bir sitede süresi dolmuş sertifika yalnızca bir uyarı gösterir; HSTS kullanan bir sitede ziyaretçiler siteye hiç giremez.

  • Politikanın kapsadığı her ana bilgisayarın, alt alan adları dâhil, sertifika süresini izleyin.
  • Yeni alt alan adlarını yalnızca ilk günden HTTPS ile açın.
  • Başlığı, CDN kenar yanıtları dâhil her HTTPS yanıtında tutun.
  • Alan adının HSTS kullandığını veya preload listesinde olduğunu belgeleyin; böylece gelecekteki ekipler onun üzerinde yalnızca HTTP ile çalışan hizmetler planlamaz.
  • HSTS'i diğer güvenlik başlıklarıyla birlikte kullanın; en karmaşığını CSP rehberi anlatıyor.

Büyük kurumların çoğu zaman çok sayıda alan adı vardır ve HSTS kararları alan adından alan adına değişir. Tek bir web uygulaması barındıran bir ürün alan adı, uzun bir max-age ve preload için kolay bir adaydır; onlarca iç alt alan adı taşıyan bir kurumsal alan adı ise yalnızca belirli ana bilgisayarlarda ve includeSubDomains olmadan HSTS'e hazır olabilir. Kararı ve gerekçesini alan adı bazında kayda geçirin ki bir sonraki ekip neyin güvenli olduğunu bilsin.

Bir alan adını satın aldığınızda ya da devraldığınızda, üzerinde hizmet planlamadan önce preload listesinde olup olmadığına ve HSTS gönderip göndermediğine bakın. HTTP Başlık Denetleyicisi mevcut başlığı gösterir, preload sitesi de alan adının listedeki durumunu gösterir. Alt alan adlarından birinde yalnızca HTTP ile çalışan bir hizmeti kurduktan sonra alan adının preload listesinde olduğunu keşfetmek, önlenebilir bir sürprizdir.

Geri adım atmanız gerekirse HTTPS üzerinden max-age=0 gönderin. Bunu alan tarayıcılar o ana bilgisayar için politikayı unutur. Kayıtlı max-age süresi dolmadan geri gelmeyen ziyaretçiler ise o ana kadar eski politikayı taşımayı sürdürür; bu da max-age değerini kademeli artırmanın bir başka gerekçesidir.

SSS

Hangi max-age değerini kullanmalıyım?

Dakikalarla ya da bir günle başlayın, sonra kademeli olarak artırın. Yalnızca HTTPS ile çalışan oturmuş bir site için bir yıl (31536000) ya da iki yıl (63072000) yaygındır; preload için en az bir yıl zorunludur.

HSTS ilk ziyarette çalışır mı?

Alan adı preload listesinde değilse çalışmaz. Aksi halde tarayıcı politikayı ilk başarılı HTTPS yanıtından öğrenir.

HSTS'i meta etiketiyle ayarlayabilir miyim?

Hayır. RFC 6797 başlığı şart koşar; tarayıcılar HTML meta öğelerindeki HSTS ifadelerini yok sayar.

HSTS'i HTTP yanıtlarında da göndermeli miyim?

Orada hiçbir etkisi olmaz, çünkü tarayıcılar düz HTTP üzerinden gelen başlığı yok sayar. HTTP'yi HTTPS'e yönlendirin ve başlığı HTTPS yanıtlarında gönderin.

HSTS'i nasıl kaldırırım?

HTTPS üzerinden max-age=0 gönderin; alan adı preload listesindeyse hstspreload.org üzerinden kaldırma talebinde bulunun. Geri dönen ziyaretçiler yeni başlığı gördükleri anda politikayı bırakır; preload listesinden çıkmak ise tarayıcı güncellemelerini bekler.

Kendi sitemde sertifika uyarısını neden tıklayıp geçemiyorum?

Tarayıcınızda o ana bilgisayar için HSTS politikası var, bu yüzden sertifika hataları ölümcül sayılır. Sertifikayı düzeltin; yerel geliştirme için politikanın kapsamadığı başka bir ana bilgisayar adı kullanın.

HSTS, API'leri ve mobil uygulamaları etkiler mi?

Yalnızca HSTS'i uygulayan istemcileri etkiler, bu da pratikte tarayıcılar demektir. API istemcileri ve uygulamalar doğrudan HTTPS adresleri kullanmalı ve sertifikaları doğrulamalıdır; HSTS onlara bir şey katmaz.

includeSubDomains e-postayı bozabilir mi?

Hayır. HSTS, tarayıcılardaki HTTP isteklerine uygulanır. Posta sunucuları ile SMTP ve IMAP bağlantıları, politikanın kapsadığı alt alan adlarında bile etkilenmez.

Hazırlık siteleri HSTS göndermeli mi?

Hazırlık ortamında kısa bir max-age kullanın ve düz HTTP ya da test sertifikaları gerekebilecekse hazırlık sitesini, production'ın includeSubDomains politikasının kapsamadığı bir ana bilgisayar adında tutun.

HSTS, HTTP'den HTTPS'e yönlendirmelerin yerini tutar mı?

Hayır. İlk kez gelen ziyaretçiler ve HSTS'i yok sayan istemciler için yönlendirme hâlâ gereklidir. HSTS ondan sonraki istekleri korur.

Kaynaklar