Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Certificate'ları İzlemek ve Kesintileri Önlemek: Envanter, Expiry Alert'leri, TLS Testleri ve Gerçek Olay Örnekleri
Certificate kesintilerini önlemek için diskteki dosyayı değil, istemcinin gördüğü certificate'ı dışarıdan ölçersin: blackbox exporter'ın last_chain metric'ine ömre göre eşikli bir alarm, probe_success alarmı, CT log ve CAA ile envanter. Reload edilmemiş yenilemeyi, eksik intermediate'ı, yanlış SAN'ı, earliest_cert_expiry'yi yanıltan cross certificate'ı ve saat kaymasını laboratuvarda üretiyor, alarmları promtool ile, TLS config'ini testssl.sh ile test ediyoruz.
mTLS ve Internal Certificate'lar: ASP.NET Core'da Client Certificate Authentication ve Kendi CA'nı İşletmek
mTLS'te istemci de bir certificate ve private key ile attığı imzayla kimliğini kanıtlar; public CA'lar client authentication EKU'sunu bıraktığı için bunun için offline root'lu kendi internal CA'n gerekir. ASP.NET Core'da AddCertificate ile CustomRootTrust, issuer ve CN tabanlı partner eşlemesi kuruyor, Kestrel'in TLS katmanındaki sessiz reddini, revocation'ı ve Nginx'in certificate'ı header ile iletmesinin private key olmadan nasıl taklit edilebildiğini gerçek koşularla görüyoruz.
HTTPS'i Zorunlu Kılmak: HTTP→HTTPS Redirect, HSTS'i Kademeli Açmak, Preload ve Mixed Content
HTTPS'i zorunlu kılmak için redirect'i TLS'in bittiği katmanda yaparsın, API'lerde redirect yerine HTTP'yi 400 ile reddedersin ve HSTS'i 5 dakikadan bir yıla kademeli açarsın; includeSubDomains'ten önce alt domain envanteri şart. Proxy arkasında UseHttpsRedirection döngüsünü ve secure'suz cookie'yi, 301'in POST'u GET'e çevirmesini, HSTS'in HTTP-only alt domain'i kilitlemesini ve Angular build'indeki mutlak http:// URL'in mixed content olarak bloklanmasını gerçek koşularla görüyoruz.
Yönetilen Platformlarda Certificate: Caddy, Azure App Service, Key Vault, Front Door ve Kubernetes'te cert-manager
Managed platformlarda certificate'ı platform alır ve yeniler, ama her birinin seni yakalayacak bir sınırı vardır: Caddy /data volume'ü olmadan rate limit'e takılır, App Service managed certificate wildcard vermez, Front Door doğrudan CNAME ister, cert-manager her yenilemede key'i değiştirir. Caddy, cert-manager ve Envoy Gateway'i Pebble ile gerçek koşularla çalıştırıp pinning'in yenilemede nasıl kırıldığını görüyoruz.
.NET'te ve Kestrel'de Certificate: dev-certs, PEM/PFX Yükleme, SNI, Yenilemede Reload ve HttpClient Doğrulaması
Kestrel, configuration'daki PEM veya PFX certificate'ını restart'sız yeniden yükler ama yalnızca Path'i izler, yaklaşık beş saniyede fark eder ve endpoint'i yeniden başlatır; root olmayan kullanıcıyla Certbot'un dosyalarını okuyamaz, bu yüzden bir deploy hook gerekir. dev-certs'in Linux'taki SSL_CERT_DIR ayarını, ServerCertificateSelector ile SNI'ı ve HttpClient'ta doğrulamayı kapatmadan CustomRootTrust ile internal CA'ya güvenmeyi gerçek koşularla görüyoruz.
Let's Encrypt ve ACME ile Otomatik Certificate: Certbot, Nginx, Wildcard ve ARI ile Yenileme
ACME ile certificate almak account, order, authorization, challenge ve finalize adımlarından oluşur; Certbot bunu Nginx'te webroot veya nginx plugin'iyle, wildcard'ı DNS-01 ile yapar ve ARI sayesinde CA'nın önerdiği zamanda yeniler. Pebble üzerinde gerçek koşularla iptal edilen bir certificate'ın ARI ile kendiliğinden yenilenmesini, profilleri, 6 günlük ve IP certificate'larını ve 80 portunu kapatmanın bedelini görüyoruz.
Certificate Yaşam Döngüsü: CSR, Domain Validation, Certificate Transparency, Revocation ve 47 Günlük Gelecek
Bir certificate CSR ile istenir, CA domain'i HTTP-01, DNS-01 veya TLS-ALPN-01 ile doğrular, certificate CT log'larına yazılır ve iptali artık OCSP'den çok CRL'e ve kısa ömre dayanır. SC-081v3 ile maksimum ömür 15 Mart 2026'da 200, 2027'de 100, 2029'da 47 güne iniyor; crt.sh, gerçek bir CRL ve .NET ile CSR üretimi üzerinden elle yenilemenin neden bittiğini görüyoruz.
Bir TLS Certificate'ın İçinde Ne Var? X.509, SAN, Chain of Trust ve Dosya Formatları
Bir TLS certificate'ı, bir public key'i SAN listesindeki isimlere bağlayan ve bir CA'nın imzaladığı X.509 belgesidir; istemci ona, imzalar zinciri trust store'undaki bir root'a ulaştığı için güvenir. openssl ve .NET X509CertificateLoader ile alanları okuyor, wildcard'ın tek seviyelik sınırını, Let's Encrypt'in cross-sign'lı Generation Y zincirini ve eksik intermediate'ın curl'ü kırıp .NET'te AIA ile nasıl gizlendiğini gerçek koşularla görüyoruz.
Edge'de Güvenlik: WAF, DDoS Koruması, Rate Limiting, Bot Yönetimi ve Origin'i Kilitlemek
Edge'deki WAF, DDoS koruması, rate limit ve bot kuralları yalnızca edge'den geçen trafiği görür; origin'in IP'si sızarsa hepsi atlanır, bu yüzden origin yalnızca CDN'den gelen bağlantıları kabul etmeli. Nginx'li bir edge'de login rate limit'inin saldırıyı origin'e ulaşmadan durdurduğunu, ASP.NET Core rate limiter'ında forwarded header sırasının müşterileri nasıl koruduğunu ve IP allowlist'in neden Authenticated Origin Pulls, tunnel veya X-Azure-FDID ile tamamlanması gerektiğini görüyoruz.
Cloudflare ile Bookstore'u Yayına Almak: Proxy, SSL/TLS Modları, Cache Rules ve Gerçek Client IP
Cloudflare'e geçerken nameserver'ı taşır, web kayıtlarını proxied, mail kayıtlarını DNS-only bırakır, SSL/TLS modu olarak Full (strict) seçer, Page Rules yerine Cache ve Redirect Rules yazar ve origin'de CF-Connecting-IP'ye yalnızca Cloudflare'in IP aralıklarından gelen bağlantılarda güvenirsin. Laboratuvarda Flexible modun ürettiği redirect döngüsünü, ASP.NET Core'da KnownIPNetworks ile sahte header'ları reddeden testleri ve Azure Front Door karşılıklarını görüyoruz.
CDN Nasıl Çalışır? Edge, Origin, Cache Key, s-maxage ve Angular + API için Doğru Cache Stratejisi
Bir CDN, cevabı cache key'e göre edge'de saklar ve origin'in header'larına uyar; bu yüzden hash'li Angular dosyalarına immutable, index.html'e no-cache, katalog API'sine s-maxage ve CDN-Cache-Control, kişiye özel cevaplara private, no-store verilir. Nginx ile kurduğumuz bir edge'de public header'ın Grace'e Ada'nın siparişlerini gösterdiğini, query string'siz cache key'in sayfaları karıştırdığını ve stale yönergelerinin origin çökükken siteyi nasıl ayakta tuttuğunu gerçek isteklerle görüyoruz.
DNS Değişikliğini Kesintisiz Yapmak: TTL Stratejisi, Nameserver Taşıma, DNSSEC ve DNS as Code
DNS'te propagation yoktur, resolver cache'i vardır: bir değişikliği kesintisiz yapmak için TTL'i en az eski TTL kadar önce düşürür, değişikliği yapar, eski hedefi log'lar sessizleşene kadar açık tutarsın. Laboratuvarda resolver cache'ini ve negative caching'i saniye saniye izliyor, DNSSEC açıkken sağlayıcı değiştirip eski DS yüzünden SERVFAIL alıyor, güvensiz ve multi-signer geçişi karşılaştırıyor ve zone'u DNSControl ile kod olarak yönetiyoruz.