Teknoloji

Nginx’te TLS 1.3, OCSP Stapling ve Brotli Nasıl Kurulur? Hızlı ve Güvenli HTTPS’nin Sıcacık Rehberi

Küçük Bir Gece Macerası: Neden Bu Ayarlarla Uğraşıyoruz?

Bir gece yarısıydı. Sunucuları güncelliyorum, kabinde bir kahve, ekranda yeşil loglar akıyor. O sırada bir dostum yazdı: “Sitede ödeme sayfası biraz yavaş gibi, ama güvenli görünüyor, değil mi?” Bir elimle kahveyi alıp öbür elimle curl çektim, üstüne bir de SSL test. Sayfa fena değil ama göz kırpan birkaç ayrıntı var: eski protokol izleri temizlenmemiş, OCSP stapling kapalı, Brotli yok. Küçük gibi duran bu detaylar, trafiğin yoğunlaştığı anlarda bıçak gibi kesiyor performansı.

Hiç başınıza geldi mi? “Her şey çalışıyor” dediğiniz bir anda, küçük ayarların ne kadar fark yarattığını fark ettiğiniz o an. Ben o gece düşündüm: gelin bu konuyu birlikte, sakin sakin ele alalım. Bugün Nginx’te TLS 1.3’ü düzgünce açacağız, OCSP Stapling ile sertifika doğrulamayı hızlandıracağız ve Brotli ile dosyaları cillop gibi sıkıştıracağız. Ama bunu kuru teknik anlatımla değil, aklımızda kalacak küçük hikâyeler ve pratik örneklerle yapalım. Mesela şöyle düşünün: Tüm bunlar, sitenizi güvenli tutarken kullanıcıya hissedilir bir hız armağan etmek için. Hadi adım adım başlayalım.

TLS 1.3 Neden Önemli? Nasıl Etkinleştiririz?

Güvenlikte en güzel duygu huzurdur. TLS 1.3 bu huzurun pratik hali. El sıkışma daha kısa, kafa karıştıran eski şifre kümeleri yok, modern tarayıcılarla pürüzsüz çalışıyor. Mesela şöyle düşünün: bir kapıdan içeri gireceksiniz, görevliler sizi tanıyor, kartınızı hızlıca okuyor ve buyurun diyor. TLS 1.3’ün hissi bu. Kısacık bir merasim ve içeri hop diye geçiş.

Nginx tarafında yapacağımız iş aslında basit. Ama önce minik bir temizlik: “Eskiyi at, yeniyi tak” gibi düşünün. TLS 1.0 ve 1.1 devrini kapatıp, 1.2 ve 1.3’ü yan yana açacağız. 1.2, eski ama hala iş gören bir dost; 1.3 ise az sözle çok iş yapan yeni arkadaş.

Aşağıda temel bir örnek var. Kendi dizin yollarınızı ve alan adınızı uyarlayın. fullchain ve private key yolları, kullandığınız sertifikaya göre değişecek.

server {
    listen 443 ssl http2;
    server_name örnek.com www.örnek.com;

    ssl_certificate /etc/letsencrypt/live/ornek.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    # TLS 1.2 için mantıklı bir set; TLS 1.3 kendi içinde modern gelir
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                 ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                 ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # HTTP Strict Transport Security (temkinli başla)
    add_header Strict-Transport-Security "max-age=31536000" always;

    root /var/www/ornek;
    index index.html;
}

Burada sihirli sayı çok yok. TLS 1.3 zaten sade geliyor. Şifre seti, ağırlıklı olarak TLS 1.2 tarafını düzeltiyor. ssl_session_tickets off diyerek bilet anahtarlarını yönetme derdini azaltıyoruz. HSTS’i hemen “includeSubDomains; preload” ile abanıp açmak yerine, önce bir nefes alıp sadece max-age ile başlamak iyi fikir. Çünkü HSTS’i genişletince geri dönüş biraz daha meşakkatli olabiliyor.

“Peki doğru mu yaptım?” diye içinizden geçiyorsa, Mozilla’nın SSL yapılandırma rehberi hızla bir hatırlatma kartı gibi iş görür. Orada profilli ayarlar var; kendi trafiğinize göre tartıp biçebilirsiniz.

Sertifika Zinciri, Küçük Hatalar ve HSTS’in İncelikleri

Bir müşterinin sitesinde bir gün sayfa durup durup “sertifika hatası” veriyordu. Sorun basit çıktı: yanlış dosyayı göstermişiz, fullchain yerine sadece leaf sertifika konmuş. Zincirin eksik halkası gibi düşünün. Tarayıcı bu eksikliği hisseder ve naz yapar. Eğer Let’s Encrypt kullanıyorsanız, genellikle fullchain.pem ve privkey.pem ikilisi yeterli olur. Ama birazdan OCSP Stapling için ayrıca “güvenilen zinciri” göstereceğiz, orada chain dosyaları işimize yarayacak.

HSTS tarafında ise yavaş adım atmak en güzeli. Önce ana alan adında deneyin, sonra alt alan adlarına yayarsınız. “preload” konusuna ise acele etmeyin; bir kez listeye girince dönüşü zaman alır. Ufak bir pilot dönem, gözlem, log’lara hızlı bir bakış, sonra genişletme… Hem güvenli hem sakin bir geçiş olur.

OCSP Stapling: Tarayıcıya “Bak Ben Temizim” Demenin Hızlı Yolu

Şimdi geldik sevdiğim sihirlerden birine: OCSP Stapling. Basitçe anlatayım. Tarayıcı normalde sertifikanızın iptal edilip edilmediğini sormak için dışarıyla konuşur. Yani kullanıcı ile sunucunuz arasına, bir de “sertifika sağlayıcısına giden ayrı yol” girer. Bu küçük yolculuk, özellikle yavaş ağlarda hissedilir. Stapling ile bunu siz yapıp, güncel sonucu kapınıza asarsınız. Tarayıcı gelir, bakar ve “tamamdır” deyip geçer.

Nginx’te iki ufak dokunuş gerekiyor: birincisi stapling’i açmak, ikincisi çözümleyici (resolver) ve güvenilen zinciri göstermek. Çözümleyici şart, yoksa Nginx OCSP sunucusunun adresini çözemeyebilir. Örnek ayar şöyle:

server {
    listen 443 ssl http2;
    server_name örnek.com;

    ssl_certificate /etc/letsencrypt/live/ornek.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 8.8.8.8 valid=300s ipv6=off;
    ssl_trusted_certificate /etc/letsencrypt/live/ornek.com/chain.pem;

    # Diğer ayarlar...
}

Minik not: Güvenilen zincir için çoğu durumda chain.pem ya da sertifika sağlayıcınızın verdiği ca-bundle dosyası kullanılır. Ayrıca, firewall dışarıya giden bağlantıları çok kısıtlıysa Nginx’in OCSP sunucusuna ulaşabildiğinden emin olun. “Bir şey eksik ama ne?” dediğimiz anların yarısı firewall’dur.

Doğrulama için şuna benzer bir komut kullanabilirsiniz. Çıktıda OCSP Response Status: successful görürseniz içiniz rahatlar:

openssl s_client -connect örnek.com:443 -servername örnek.com -tls1_3 -status < /dev/null | grep -E "OCSP|Verify" -A3

Let’s Encrypt kullanıyorsanız, stapling için ufak davranış notları ve sık sorulanları şu sayfada derli toplu görebilirsiniz: Let’s Encrypt’in stapling notları. Kısa ve öz; sorun yaşadığınızda hayat kurtarır.

Brotli ile Sıkıştırma: Asfalt Gibi Pürüzsüz, Hafif ve Hızlı

Bir projede dosyaları sıkıştırmayı açtık, ama gerçek hız kazanımı bir türlü gelmiyordu. Sonra fark ettik: Brotli yok, sadece klasik gzip var. Gzip kötü değil, ama Brotli bazı dosya türlerinde çok daha iyi bir sonuç veriyor. Özellikle CSS ve JS gibi metin ağırlıklı içeriklerde farkı gözle görür gibi olursunuz. Yine listeye girmeden söyleyeyim: her zaman değil, çoğu durumda daha iyi. Bu cümleyi hissetmeniz yeterli.

Nginx’te Brotli dahili gelmez; modül olarak yüklemek gerekir. Bazı dağıtımlarda hazır paket vardır, bazılarında modülü ayrıca kurmanız gerekir. Kurduktan sonra genellikle iki modül dosyası yüklersiniz ve ayarlar şöyle görünür:

# /etc/nginx/nginx.conf ya da en başta yüklenen bir conf dosyasında
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

http {
    brotli on;
    brotli_comp_level 5;            # 4-6 çoğu site için tatlı noktadır
    brotli_static on;               # .br hazırsa direkt onu servis et
    brotli_types text/plain text/css text/xml application/javascript 
                 application/json application/xml+rss application/xhtml+xml 
                 application/ld+json image/svg+xml;

    gzip on;                        # Eski tarayıcılar için nazik bir yedek
    gzip_types text/plain text/css application/javascript application/json 
               image/svg+xml;

    # ... diğer http ayarlarınız
}

brotli_static on derseniz, Nginx dosyanın yanında .br uzantılı önceden sıkıştırılmış bir versiyon bulursa onu doğrudan sunar. Bu, özellikle yoğun trafiği olan sitelerde CPU tüketimini azaltır. Statik dosyalarınız için dağıtım pipeline’ınıza bir küçük görev ekleyin: derlenen CSS/JS çıktılarının Brotli versiyonlarını da üretin. Komut satırında tek seferlik denemek isterseniz:

brotli -Z -o app.min.js.br app.min.js
brotli -Z -o app.min.css.br app.min.css

Bu arada istemci “Brotli destekliyorum” demiyorsa, gzip hâlâ yanında dursun. Böylece herkese eli boş dönmeyen bir sunucu olur. Daha sonra log’lardan hangi oranda Brotli kullanıldığını görür, ayarı ince ayar çekersiniz.

HTTP/2, ALPN ve Küçük Dokunuşlar

“http2” parametresini gördünüz ya, işte o güzel bir hızlanma hissi verir. Çok sayıda küçük dosyayı daha akıllı şekilde taşımanıza yardımcı olur. Bunun yanında ALPN dediğimiz küçük bir protokol tanışması var; özetle tarayıcı “HTTP/2 konuşalım mı?” diye nazikçe sorar, Nginx de “elbette” der. Bu konuşmanın olması için TLS tarafının temiz olması önemli; o yüzden TLS 1.3 ile uyumlu ayarları yapmak sadece güvenlik değil, hız için de kritik.

Benim küçük rutinim şöyle: önce staging veya az trafikli bir site üzerinde denerim. Nginx’i config test ile kontrol ederim, sonra yumuşak bir reload. Hiçbir bağlantıyı zedelemeden geçiş olur. Birkaç saat gözlerimle izler, log’lara bakarım. Takılırsa geri almak bir komut. Takılmazsa, ana siteye aynı ayarları taşırım. Gece vakti yaptığım o küçük ayarların sabah kullanıcı deneyimine dönüşmesini izlemek epey keyifli.

nginx -t && systemctl reload nginx

OCSP ve Brotli’yi Doğrulamak: “Gerçekten Çalışıyor mu?”

İşin en güzel tarafı test etmesi. “Gerçekten Brotli ile geliyor mu?” diye merak ettiğinizde basit bir başlık sorgusu bile yeter:

curl -I --compressed https://örnek.com/app.min.js
# Çıktıda Content-Encoding: br görüyorsanız brotli devrede demektir

OCSP için az önce bahsettiğim openssl s_client komutunun çıktısı yol gösterir. Ayrıca Nginx error log’larında “stapling” ile ilgili satırlar görürseniz, küçük uyarılar size sorunun yönünü söyler. Bir keresinde sadece DNS çözümleyici eksik olduğundan stapling hiç devreye girmemişti; resolver satırı her şeyi çözdü.

“Hangi direktif ne yapıyor, başka neler var?” derseniz, resmi dökümana bir göz atın: Nginx SSL modülü dokümantasyonu. Değerlerin anlamını sade şekilde anlatır, kafadaki boşlukları güzel doldurur.

Sertifika Yenileme, Otomasyon ve Küçük Tuzaklar

Sertifikalar yenilenir; hayat devam eder. certbot ya da kullandığınız araç sertifikayı tazelediğinde Nginx’in bunu fark etmesi için bir deploy hook koymak iyi fikir. Böylece “sertifika güncellenmiş ama Nginx eski dosyayı tutuyor” gibi bir pürüz yaşanmaz.

certbot renew --deploy-hook "systemctl reload nginx"

Bir de şu var: bazı sertifika sağlayıcıları zincirde küçük değişiklikler yapabilir. O yüzden ssl_trusted_certificate yolunu hard-code yazdıysanız, yenileme sonrası doğru dosyayı işaret ettiğinizden emin olun. Bir müşteride “her şey tamam” dediğimiz halde stapling kaybolmuştu; meğer chain dosyası yolu değişmiş.

Firewall tarafı da sakince gözden geçirilmeli. Dışarıya giden 80/443 ve DNS sorgularının izinli olması, Nginx’in OCSP sunucularına ulaşması için gerekli. DNS-over-HTTPS kullanan bir ortamdaysanız, ek bir katman daha devreye giriyor; burada da sistemin genel DNS yolculuğunu netleştirmek işinizi kolaylaştırır.

Önbellek, Sıkıştırma ve Nginx’in Renkli Dünyası

Sıkıştırma performansı tek başına kalmıyor; cache ile yan yana yürüyünce güzelleşiyor. Statik dosyaları uzun süreli önbelleğe bırakmak, Brotli’nin etkisini katlar. Yine “az laf, çok iş” mantığı. Eğer WordPress gibi dinamik bir yapınız varsa, tam sayfa önbellekleme üzerine şu rehber kafanızda resmin tamamını netleştirebilir. Sıkıştırma, önbellek ve protokol ayarları el ele yürüyünce, kullanıcı tarafında bekleme yerine akış hissi doğuyor.

Bu arada “0-RTT” gibi TLS 1.3’ün daha ileri özelliklerine girmek istemiyorum, çünkü orada başka hassas tartışmalar var. Önce sağlam bir temel atalım: protokol düzgün, stapling aktif, Brotli çalışıyor. Sonra yavaş yavaş diğer şeritlere geçeriz. Bu yaklaşımda geri dönüşler de kolay olur.

Adım Adım Özet Akış: Temiz Kurulumun Kısa Hikâyesi

1) TLS 1.3 ve Temel Güvenlik Ayarları

Önce TLS 1.3 ve 1.2’yi birlikte açın. Eski protokolleri kapatın. Şifre kümelerini sade tutun, biletleri devre dışı bırakıp HSTS’i ölçülü açın. Bir nefes alıp nginx -t ile doğrulayın, ardından yumuşak bir reload. Tarayıcıyla el sıkışma kısa ve net olsun.

2) OCSP Stapling ile Hafifleyen Doğrulama

Stapling’i açın, resolver ayarlayın, güvenilen zinciri gösterin. Firewall dışarı çıkışa izin veriyor mu bakın. openssl s_client ile durumunuzu kontrol edin. Sakin bir log taraması, birkaç kullanıcı testi, sonra asıl siteye geçiş.

3) Brotli ile Akıcı Yüklemeler

Modülü yükleyin, seviyeyi makul ayarlayın, brotli_static ile build pipeline’a .br üretimini ekleyin. Gzip’i yedekte tutun. curl –compressed ile başlıklarda Brotli’yi görün. Dosya boyutları küçüldükçe hissedilen akıcılık artar.

4) Ölç, Gözle, Minik Dokunuşlar

CDN kullanıyorsanız üst katmandaki önbellekle konuşsun bu ayarlar. Log’lardan içerik kodlamalarını, durumları, bekleme sürelerini izleyin. Küçük ayarlar büyük etkiler yapar; bu yüzden acele etmeyin. Gerekirse geri almak bir komutla mümkün.

Sahadan Küçük Deneyimler: Nerede Takılabiliriz?

Bir keresinde Nginx her şeyi doğru yapıyor gibi görünüyordu ama tarayıcı hala OCSP isteği atıyordu. Sorun, sertifika sağlayıcısının OCSP sunucusuna giden yolun DNS’te takılmasıydı. resolver satırını ekleyince bir anda işlemler ışık hızında düzeldi. Başka bir sefer, Brotli statik dosyaları servis etmiyordu; meğer dosyaları CI pipeline üretmemiş, prod sunucu da real-time sıkıştırmada CPU’yu yoruyordu. .br dosyaları gelince her şey süt liman oldu.

En sevdiğim derslerden biri de şu: önce küçük bir alanı dönüştürmek. Bir alt alan adı, ayrı bir sunucu, hatta gizli bir rota. “Canary” gibi düşünün. Orada pürüzleri görüp toparlayınca ana siteye geçiş hem risksiz hem de çok daha hızlı oluyor. Üstelik ekibin geri kalanını da ikna etmek kolaylaşıyor; sonuç ortada çünkü.

Dış Kaynaklarla Ufak Bir Yol Haritası

Bu yazıyı bitirmeden, kısa bir kaynak notu bırakayım. Ayarları derinleştirmek isterseniz, Nginx SSL modülü dokümantasyonu net ve güncel. Sertifika tarafında stapling davranışlarını merak ederseniz, Let’s Encrypt’in stapling notları iyi bir rehber. Ayar setlerini tartmak ve hızlıca denemek için de Mozilla’nın SSL yapılandırma rehberi pratik bir kılavuz gibi.

Kapanış: Hız ve Güvenlik Aynı Masada Oturabilir

Toparlayalım. TLS 1.3 ile el sıkışmayı kısalttık, OCSP Stapling ile tarayıcının üstüne düşen ekstra işi güneşli bir pazar yürüyüşüne çevirdik, Brotli ile nefes alan sıkıştırma ekledik. Hepsi bir araya geldiğinde ortaya hem güvenli hem akıcı bir deneyim çıkıyor. Kullanıcı “bu site bir ferah ya” diyor, siz de log’larda güzel rakamlar görüyorsunuz. Ama bence daha önemli olan şu: içimiz rahat ediyor. Sunucu tarafında doğru şeyleri, doğru sırayla yapmanın huzuru.

Eğer yeni başlıyorsanız, küçük adımlarla ilerleyin. Önce TLS ve temel güvenlik, sonra stapling, ardından Brotli. Her adımdan sonra kısa bir test, minik bir gözlem. Takıldığınız yerde karanlıkta kalmayın; log’lar, küçük komutlar ve minik geri dönüşler en iyi dostunuz. Umarım bu rehber, masanızdaki kahveyi soğutmadan işinizi kolaylaştırır. Bir başka yazıda, bu ayarların CDN ve HTTP/3 tarafındaki tatlı detaylarına da değiniriz. Görüşmek üzere!

Sıkça Sorulan Sorular

Genelde kırılmaz, çünkü TLS 1.2’yi de açık bırakırsınız. Eski tarayıcı TLS 1.2 ile bağlanır, yeniler 1.3’ü tercih eder. Sadece çok çok eski istemciler sorun çıkarır.

Tarayıcının ayrı bir yere gidip sertifikanızı sorgulamasını engeller. Sunucu sonucu hazır verir. Böylece ekstra ağ turu olmaz, ilk yükleme daha akıcı olur.

Dinamik sıkıştırmada biraz yük olur, ama statik .br dosyaları üretirseniz bu yük büyük ölçüde azalır. Çoğu sitede orta seviye sıkıştırma ile rahat çalışır.