
Nginx SSL/TLS Sertifikası Kurulumu ve HTTPS Yapılandırması
Nginx web sunucusunda SSL/TLS sertifikası kurulumu ve HTTPS yapılandırması. HTTP/2, HSTS, OCSP stapling ve güvenli cipher suite ayarları.
Nginx SSL/TLS Sertifikası Kurulumu ve HTTPS Yapılandırması
Nginx, yüksek performanslı web sunucusu olarak HTTPS yapılandırması için kapsamlı seçenekler sunar. SSL Labs A+ skoru almak için optimize edilmiş yapılandırma rehberi.
Ön Koşullar
# Nginx kurulu olmalı
nginx -v
# SSL sertifikası hazır olmalı
# Let's Encrypt ile: certbot --nginx -d sitem.com
Let's Encrypt Detaylı Kurulum
Certbot Kurulumu
# Ubuntu/Debian
apt install certbot python3-certbot-nginx
# RHEL/AlmaLinux/Rocky
dnf install epel-release
dnf install certbot python3-certbot-nginx
Sertifika Edinme — 3 Ana Yöntem
| Yöntem | Doğrulama | Wildcard | Ne zaman? |
|---|---|---|---|
| HTTP-01 | /.well-known/acme-challenge/ |
❌ | Standart tek/multi domain |
| DNS-01 | TXT kaydı | ✅ | Wildcard veya CDN arkasında site |
| TLS-ALPN-01 | 443 portu üzerinden | ❌ | 80 portu kullanılamıyorsa |
# HTTP-01 (en yaygın) — Nginx eklentisi otomatik
certbot --nginx -d sitem.com -d www.sitem.com
# DNS-01 — Wildcard sertifika
certbot certonly --manual --preferred-challenges dns \
-d sitem.com -d "*.sitem.com"
# DNS-01 + Cloudflare API (otomatik wildcard)
certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d sitem.com -d "*.sitem.com"
Otomatik Yenileme (Renewal)
Let's Encrypt sertifikaları 90 gün geçerli, 60. günden itibaren yenilenebilir.
# Cron yöntemi (dağıtım certbot zaten kurar, kontrol et)
systemctl list-timers | grep certbot
# Manuel test (gerçekten yenilemez)
certbot renew --dry-run
# Yenilemede özel hook (Nginx reload)
echo 'nginx -s reload' > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
⚠️ Yenileme başarısız olursa 48 saat içinde uyarı e-postası alırsınız (kayıt sırasında belirttiğiniz e-postaya). Bu e-postaya kesinlikle dikkat edin — sertifika dolarsa site yok olur.
SAN (Multi-Domain) Sertifikası
Tek sertifika ile birden fazla alan adı:
certbot --nginx \
-d sitem.com -d www.sitem.com \
-d blog.sitem.com -d shop.sitem.com \
-d sitem-yedek.com.tr
Maksimum 100 domain tek sertifikada. Bir tane bile başarısız olursa tümü alınamaz — DNS doğrulamasını tek tek test edin.
Temel SSL Yapılandırması
# /etc/nginx/sites-available/sitem.com
server {
listen 80;
server_name sitem.com www.sitem.com;
# HTTP'yi HTTPS'ye yönlendir
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name sitem.com www.sitem.com;
# Sertifika dosyaları
ssl_certificate /etc/letsencrypt/live/sitem.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sitem.com/privkey.pem;
root /var/www/sitem;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Güvenli SSL Protokol Ayarları
# /etc/nginx/snippets/ssl-params.conf
# Sadece TLS 1.2 ve 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# Güvenli cipher suite'ler
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_prefer_server_ciphers off;
# Session cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# DH parametreleri
ssl_dhparam /etc/nginx/dhparam.pem;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/sitem.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# DH parametresi oluştur (2048 veya 4096 bit)
openssl dhparam -out /etc/nginx/dhparam.pem 2048
Güvenlik Başlıkları
# /etc/nginx/snippets/security-headers.conf
# HSTS - Tarayıcıya her zaman HTTPS kullan
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Clickjacking koruması
add_header X-Frame-Options "SAMEORIGIN" always;
# MIME type sniffing koruması
add_header X-Content-Type-Options "nosniff" always;
# XSS koruması
add_header X-XSS-Protection "1; mode=block" always;
# Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Content Security Policy (örnek)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.trusted.com; style-src 'self' 'unsafe-inline';" always;
# Permissions Policy
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Tam Yapılandırma Örneği
server {
listen 443 ssl http2;
server_name sitem.com www.sitem.com;
ssl_certificate /etc/letsencrypt/live/sitem.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sitem.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/security-headers.conf;
root /var/www/sitem/public;
index index.html index.php;
# Gzip sıkıştırma
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
# PHP-FPM
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Statik dosya cache
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# .htaccess erişimini kapat
location ~ /\.ht {
deny all;
}
}
SSL Testi
# SSL Labs online test
# https://www.ssllabs.com/ssltest/analyze.html?d=sitem.com
# Lokal test
openssl s_client -connect sitem.com:443 -tls1_2
openssl s_client -connect sitem.com:443 -tls1_3
# Sertifika bilgisi
openssl s_client -connect sitem.com:443 2>/dev/null | openssl x509 -noout -dates
# testssl.sh ile kapsamlı test
bash testssl.sh sitem.com
HTTP/2 Server Push
# Kritik kaynakları önceden gönder
location = /index.html {
http2_push /css/style.css;
http2_push /js/main.js;
}
TLS 1.3 ve HTTP/3 (QUIC) Modern Protokoller
TLS 1.3 İyıleştirmeleri
TLS 1.3, TLS 1.2'ye göre handshake süresini yarıya indirir (1-RTT) ve 0-RTT (early data) ile tekrar bağlantılarda anında veri transferi sunar.
ssl_protocols TLSv1.2 TLSv1.3;
# TLS 1.3 özel cipher (otomatik aktif, ama açıkça yazılabilir)
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
# 0-RTT (early data) — tekrar bağlantılarda RTT=0
ssl_early_data on;
# session resumption iyileştirme
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
⚠️ 0-RTT replay attack riski: GET dışında metodlarda (POST/PUT/DELETE) early_data kapatılmalı. Application layer'da Idempotency-Key kullanın.
HTTP/3 (QUIC) — UDP Üzerinden
HTTP/3, TCP yerine UDP üzerinde çalışır; head-of-line blocking sorunu yoktur, mobile network'te %10-30 daha hızlı.
# Nginx 1.25+ HTTP/3 native destek
server {
listen 443 ssl http2;
listen 443 quic reuseport;
http3 on;
ssl_certificate ...;
ssl_certificate_key ...;
# Alt-Svc header — tarayıcıya HTTP/3'ü duyur
add_header Alt-Svc 'h3=":443"; ma=86400';
}
⚠️ HTTP/3 için UDP 443 portu firewall'da açık olmalı — TCP 443 yetmez.
Brotli vs Gzip
# Gzip (yaygın, default)
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
# Brotli (15-25% daha iyi sıkıştırma)
# ngx_brotli modülü gerek
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
Büyükweb LiteSpeed paketlerinde Brotli + HTTP/3 default aktif gelir; manuel kurulum gerekmez.
SSL Labs A+ Skoru — Madde Madde Kontrol Listesi
[ssllabs.com/ssltest](MASK35) testinde A+ almak için tüm aşağıdaki maddeler ✓ olmalı:
| Kategori | Gereksinim | Konfig |
|---|---|---|
| Sertifika | RSA 2048 + ya da ECDSA P-256 | Let's Encrypt default OK |
| Sertifika zinciri | Tam fullchain.pem | ssl_certificate fullchain.pem |
| Protokol | TLS 1.2 + 1.3 only | ssl_protocols TLSv1.2 TLSv1.3 |
| Cipher | Forward secrecy (ECDHE/DHE) | Yukarıdaki cipher listesi |
| Cipher order | Server preference (TLS 1.2) | ssl_prefer_server_ciphers on (1.2 için) |
| Forward Secrecy | Tüm bağlantılar | ECDHE cipher zorunlu |
| HSTS | max-age ≥ 6 ay | max-age=31536000; includeSubDomains; preload |
| HSTS Preload | hstspreload.org listesi | Submit + 1-2 hafta bekleme |
| OCSP Stapling | Aktif + verify | ssl_stapling on; ssl_stapling_verify on |
| DHE 2048+ | Eğer DHE kullanılıyorsa | openssl dhparam -out dhparam.pem 2048 |
| Mixed Content | HTTP kaynak yok | Content-Security-Policy: upgrade-insecure-requests |
Not: A+ skoru için HSTS preload kayıt zorunlu. includeSubDomains + preload direktifi, alt domainler için de SSL hazır olduğunda eklenmeli (yoksa sub-domain uçurur).
Yaygın SSL/TLS Hataları ve Çözümleri
| Hata | Sebep | Çözüm |
|---|---|---|
| NET::ERR_CERT_AUTHORITY_INVALID | Self-signed veya bilinmeyen CA | Geçerli CA'dan sertifika alın |
| NET::ERR_CERT_DATE_INVALID | Sertifika süresi doldu | certbot renew; otomatik renewal kontrol |
| NET::ERR_CERT_COMMON_NAME_INVALID | Domain ile sertifika eşleşmiyor | -d ile doğru domain dahil et |
| SSL_ERROR_SYSCALL | Cipher uyumsuzluğu (eski cihaz) | Modern cipher set, eski TLS desteği yok |
| NET::ERR_SSL_PROTOCOL_ERROR | TLS 1.0/1.1 disabled, eski browser | Browser güncellemesi öner; site mesajı |
| Mixed Content uyarısı | HTTPS sayfada HTTP resim/script | upgrade-insecure-requests CSP veya tüm URL'leri https'le |
| SSL handshake failed | dhparam veya cipher hatası | nginx -t çalıştır; dhparam yeniden üret |
| OCSP stapling failed | Resolver yanlış | resolver 1.1.1.1 8.8.8.8 valid=300s ekle |
| HSTS aktifken HTTPS bozuk | Tarayıcıda HSTS cache; HTTP'ye dönülemiyor | chrome://net-internals/#hsts ile temizle |
Hızlı Doğrulama Komutları
# Sertifika geçerlilik tarihleri
echo | openssl s_client -servername sitem.com -connect sitem.com:443 2>/dev/null | openssl x509 -noout -dates
# Hangi protokoller destekleniyor?
nmap --script ssl-enum-ciphers -p 443 sitem.com
# Detay handshake
openssl s_client -connect sitem.com:443 -tls1_3 -servername sitem.com
# Sertifika zinciri tam mı?
curl -vI https://sitem.com 2>&1 | grep -i 'subject\|issuer\|verify'
Yapılandırmayı Doğrula ve Uygula
nginx -t
systemctl reload nginx
[Büyükweb hosting](MASK36) ve [VDS sunucuları](MASK37) ücretsiz Let's Encrypt SSL ve Nginx ile güvenli, hızlı web barındırma sunar.
SSL/TLS Sıkça Sorulan Sorular
Ücretsiz SSL ile ücretli arasındaki gerçek fark?
Şifreleme tarafında hiçbir fark yok — Let's Encrypt ile ECDSA P-256 / RSA 2048 modern, eşdeğer. Fark: doğrulama seviyesi (DV/OV/EV), sigorta tutarı (banka için $1M+), wildcard fiyatı (LE ücretsiz, paid LE için aynı). Kurumsal banka/finans için OV/EV mantıklı; standart blog/site/e-ticaret için Let's Encrypt yeterli.
TLS 1.0 / 1.1 destekleyebilir miyim?
Hayır. PCI DSS ve modern güvenlik standartları yasakladı. Eski ödeme entegrasyonu varsa onu güncelletip TLS 1.2+'ya çıkarın. Eski Android (5.x altı) gibi nadir cihazlar zaten %1'den az pazar payı.
HTTP/2 ile HTTP/3 farkı pratik?
HTTP/3 mobil ağlarda hissedilebilir hızlı (paket kaybında HoL blocking yok). Sabit fiber bağlantıda fark %5'in altında. CDN kullanıyorsanız zaten aktif gelir; kendi sunucu ise ek konfigürasyon yatırımı (Nginx 1.25+ + UDP 443).
Wildcard mı SAN mı?
- Wildcard (
*.sitem.com) — bilinmeyen sayıda subdomain (multi-tenant SaaS) - SAN — sabit, sayılı domain (5-10 specific subdomain)
- Wildcard daha esnek ama tek private key paylaşılır → tüm subdomain saldırı yüzeyinde
- SAN her domain için tek tek listelenir → daha kontrollü
Let's Encrypt rate limit'lere takılırsam?
Haftalık 50 sertifika / domain ve 5 duplicate certificate limit var. Aşılırsa ZeroSSL veya Buypass alternatifi. Otomatik testlerde --staging flag kullanın (gerçek kotaya yansımaz).
CDN arkasında SSL nasıl?
- Cloudflare Flexible: Origin HTTP, CDN HTTPS — ZAYIF, mixed content riski
- Cloudflare Full: Origin self-signed HTTPS, CDN HTTPS — orta
- Cloudflare Full (strict): Origin geçerli SSL + CDN HTTPS — DOĞRU
Mutlaka "Full strict" + Origin'de Let's Encrypt sertifika.
Büyükweb VDS'de Nginx + SSL kurulumu manuel mi?
VDS ve Linux Reseller paketlerinde root erişimi var; manuel kurarsınız ama destek ekibimiz ücretsiz yardımcı olur. cPanel paketlerinde AutoSSL otomatik — Let's Encrypt sertifikaları arka planda 24/7 yenilenir.
HSTS preload'a girmek geri dönülmez mi?
Pratikte evet — geri dönüş çok zor. Browserlar listeyi binary derleme içine alır; kaldırma talebi 6-12 ay sürer ve bu süre boyunca site kullanıcılar için yanlış davranabilir. Bu yüzden preload'a tüm subdomain'lerde HTTPS hazır olduğunda girin.
İlgili Büyükweb Hizmetleri
Sunucu ve site güvenliğini ciddiye alanlar için Türkiye Tier 3 veri merkezimizdeki paketler:
- Imunify360 Korumalı Web Hosting
- Tam Yetki VDS Sunucu
- OpenVPN Paketleri
- Datacenter Proxy
- Fiziksel Dedicated Sunucu
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Güvenlik & SSL İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

