Buyukweb
Nginx SSL/TLS Sertifikası Kurulumu ve HTTPS Yapılandırması

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ı.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü9 dakika okuma

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:

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:

#nginx#ssl#tls#http#https#kurulum rehberi

Bu yazıyı paylaş