HSTS Nedir? Strict-Transport-Security Başlığı ve Preload Riski
Siteyi HTTPS’e yönlendirdiniz, kilit simgesi görünüyor. Yine de küçük bir açık kalır: ziyaretçi adres çubuğuna siteadi.com yazdığında tarayıcı ilk isteği HTTP olarak gönderir. Sunucu bu isteği 301 ile HTTPS’e çevirir, ama o ilk istek şifresiz gider.
Aynı ağ üzerindeki bir saldırgan (ortak Wi-Fi, ele geçirilmiş modem) bu ilk isteği yakalayıp yönlendirmeyi kendi üzerine çekebilir. Bu saldırı SSL stripping adıyla bilinir ve yönlendirme kuralı ne kadar doğru yazılmış olursa olsun engellenemez, çünkü sorun ilk pakettedir.
HSTS (HTTP Strict Transport Security) tam olarak bu boşluğu kapatır. Sunucu bir kere “bu alan adına bundan sonra yalnızca HTTPS ile bağlan” der, tarayıcı bunu kaydeder ve sonraki ziyaretlerde HTTP isteğini hiç göndermeden doğrudan HTTPS’e geçer.
Başlık nasıl çalışır
HSTS tek bir HTTP yanıt başlığından ibarettir:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Tarayıcı bu başlığı gördüğünde alan adını kendi iç listesine yazar. Süre dolana kadar, kullanıcı adres çubuğuna http:// yazsa bile tarayıcı isteği sunucuya göndermeden HTTPS’e çevirir. Ayrıca sertifika hatası durumunda gösterilen “yine de devam et” bağlantısı kaldırılır; kullanıcı uyarıyı atlayamaz.
Önemli bir ayrıntı: başlık yalnızca HTTPS yanıtlarında geçerlidir. HTTP yanıtına eklerseniz tarayıcı görmezden gelir.
Parametreler
- max-age — Kuralın saniye cinsinden geçerlilik süresi.
31536000bir yıl demektir. Her ziyarette sayaç sıfırlanıp yeniden başlar.max-age=0yazmak kuralı iptal eder. - includeSubDomains — Kural bütün alt alan adlarını kapsar.
blog.siteadi.com,panel.siteadi.com,test.siteadi.comdâhil hepsi HTTPS zorunlu hale gelir. En çok soruna yol açan parametre budur. - preload — Alan adının tarayıcılarla birlikte dağıtılan sabit listeye eklenmek üzere aday olduğunu belirtir. Bunu eklemek tek başına listeye girmenizi sağlamaz, ayrıca başvuru yapmak gerekir.
.htaccess ile ekleme
Apache veya LiteSpeed çalışan paylaşımlı hostingde public_html/.htaccess dosyasına şu bloğu ekleyin:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
</IfModule>
Nginx kullanıyorsanız sunucu bloğuna add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; satırı gelir. Başlığın gerçekten gittiğini görmek için tarayıcıda F12 > Ağ sekmesinde ana belgeyi seçip Yanıt Başlıkları listesine bakın.
Preload listesi ve geri dönüşü olmayan risk
Preload listesi Chrome, Firefox, Safari ve Edge’in kaynak koduna gömülü bir alan adı listesidir. Listeye giren alan adı, tarayıcı siteyi hiç ziyaret etmemiş olsa bile ilk istekten itibaren HTTPS zorunlu sayılır. İlk ziyaret boşluğu tamamen kapanır.
Bedeli ağırdır. Listeye girmek için max-age en az 31536000 olmalı, includeSubDomains ve preload parametreleri bulunmalıdır. Girdikten sonra çıkmak istediğinizde:
- hstspreload.org üzerinden çıkarma talebi açarsınız.
- Talep işlenip yeni tarayıcı sürümüne girmesi aylar sürer.
- Kullanıcıların o sürüme güncellemesi ayrıca zaman alır.
Yani listeye girdikten sonra alan adınızın herhangi bir alt adını HTTP üzerinden yayınlamak pratikte 6-12 ay boyunca imkânsız hale gelir. Bu, geri alınabilir bir ayar değildir.
Açmadan önce kontrol listesi
| Kontrol | Neden önemli |
|---|---|
| Tüm alt alan adları HTTPS ile çalışıyor mu? | includeSubDomains ile birlikte sertifikasız her alt ad erişilemez olur |
| Sertifika otomatik yenileniyor mu? | HSTS aktifken süresi dolan sertifikada kullanıcı uyarıyı atlayamaz, site tamamen kapanır |
| HTTP üzerinden çalışan bir servis var mı? | Eski yazıcı arayüzü, IoT paneli, ödeme callback’i gibi noktalar bozulur |
| Karma içerik temizlendi mi? | HTTP kaynaklar zaten engellenir, önce düzeltilmeli |
| Cloudflare SSL modu Full (strict) mü? | Flexible modda uçtan uca şifreleme yoktur |
Alt alan adı konusu özellikle önemlidir. Şirketlerde çoğu zaman unutulmuş bir eski.siteadi.com ya da yalnızca iç ağdan erişilen bir kamera.siteadi.com bulunur. Alt alan adlarının tamamını DNS panelinden listeleyip her birinin geçerli sertifikası olduğunu doğrulamadan includeSubDomains eklemeyin.
Yanlış kurulumda ne olur
Tipik senaryo şudur: Bir şirket ana sitede HSTS’i bir yıllık max-age ve includeSubDomains ile açar. Ertesi hafta pazarlama ekibi kampanya.siteadi.com adında bir alt alan adı oluşturur, sertifika kurmayı unutur. Siteye giren herkes NET::ERR_CERT_COMMON_NAME_INVALID hatası alır ve “gelişmiş” bağlantısı görünmediği için devam edemez. Ziyaretçinin tek çıkışı tarayıcı ayarlarından HSTS kaydını elle silmektir; bunu kimse yapmaz.
Kademeli açmak bu riski neredeyse sıfırlar. İlk hafta max-age=300 (5 dakika) ile başlayın, sorun çıkmazsa max-age=86400 (1 gün), sonra bir haftaya, ardından bir yıla çıkın. Bu sırada includeSubDomains parametresini en sona bırakın. Sorun çıkarsa max-age=0 yazıp beklemek yeterlidir, çünkü kısa süre zaten hızlıca dolar.
Yeni sertifika kurulumu veya yenilemesi yaparken de bu bağımlılığı unutmayın; sertifika süresini takip etmek HSTS açık bir sitede opsiyonel değil zorunludur.
Özetle
- HSTS, HTTPS yönlendirmesindeki ilk şifresiz isteği ortadan kaldırır ve SSL stripping saldırısını engeller.
- Başlık yalnızca HTTPS yanıtlarında etkilidir; HTTP yanıtına eklemek işe yaramaz.
includeSubDomainseklemeden önce her alt alan adının geçerli sertifikası olduğunu doğrulayın.- Preload listesine girmek pratikte geri alınamaz; kararı en son ve emin olduğunuzda verin.
max-agedeğerini 5 dakikadan başlatıp kademeli artırın, sorun çıkarsamax-age=0ile iptal edin.