· 6 dk okuma

Nginx Kurulumu ve Let's Encrypt Ücretsiz SSL: Certbot Rehberi

Nginx kurulumu ve Let's Encrypt ücretsiz SSL sertifikası almak, bir Linux sunucuda birkaç komutla tamamlanır: Nginx'i paket yöneticisiyle kurar, alan adınızı sunucuya yönlendirir ve certbot --nginx ile sertifikayı alırsınız. Certbot yenileme zamanlayıcısını da kendisi kurar. Geriye HTTP→HTTPS yönlendirmesini ve güvenli TLS ayarlarını doğrulamak kalır.

Bu rehberde Ubuntu/Debian ve AlmaLinux/Rocky üzerinde ilerliyoruz. Örneklerde example.com alan adını ve dokümantasyon amaçlı 192.0.2.10 IP adresini kullanıyoruz. Kendi değerlerinizle değiştirin.

Başlamadan Önce: Gereksinimler

DNS kaydını şöyle kontrol edebilirsiniz:

dig +short A example.com
dig +short AAAA example.com

Çıktıda başka bir sunucunun IP'si görünüyorsa sertifika alma adımı büyük olasılıkla başarısız olur. Önce DNS'i düzeltin.

1. Nginx Kurulumu

Ubuntu / Debian

sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx

UFW kullanıyorsanız Nginx profilini açın:

sudo ufw allow 'Nginx Full'
sudo ufw status

AlmaLinux / Rocky Linux

sudo dnf install -y nginx
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload

Tarayıcıdan http://192.0.2.10 adresini açın. Nginx karşılama sayfasını görmeniz gerekir. Komut satırından da deneyebilirsiniz:

curl -I http://192.0.2.10

2. Alan Adı İçin Server Block Oluşturma

Certbot'un doğru bloğu bulabilmesi için server_name değerinin alan adınızla birebir eşleşmesi gerekir.

sudo mkdir -p /var/www/example.com/html
echo "<h1>example.com çalışıyor</h1>" | sudo tee /var/www/example.com/html/index.html
sudo nano /etc/nginx/conf.d/example.com.conf
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Yapılandırmayı test edip yeniden yükleyin:

sudo nginx -t
sudo systemctl reload nginx

Ubuntu'da varsayılan sites-enabled/default dosyası default_server olarak kalabilir. Bu normaldir. Yalnızca aynı server_name iki farklı dosyada tanımlıysa uyarı alırsınız.

3. Certbot Kurulumu

Certbot ekibi Linux için snap paketini önerir. Böylece paket yöneticisindeki eski sürümlere takılmazsınız.

sudo apt install -y snapd          # Ubuntu'da genelde hazırdır
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Snap kullanmak istemezseniz dağıtımın deposundan kurabilirsiniz:

# Debian/Ubuntu
sudo apt install -y certbot python3-certbot-nginx

# AlmaLinux/Rocky (EPEL gerekir)
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx

Depo sürümü daha eski olabilir ama çoğu kurulumda sorunsuz çalışır.

4. Sertifika Alma

Nginx eklentisiyle tek komut yeterlidir:

sudo certbot --nginx -d example.com -d www.example.com \
  -m admin@example.com --agree-tos --redirect

Certbot şunları yapar:

  1. Let's Encrypt'e hesap açar ve alan adı doğrulamasını başlatır.
  2. Sertifikayı /etc/letsencrypt/live/example.com/ altına yazar.
  3. Nginx yapılandırmanıza listen 443 ssl ve sertifika yollarını ekler.
  4. --redirect ile HTTP isteklerini HTTPS'e yönlendirir.

Sonucu kontrol edin:

sudo certbot certificates
curl -I http://example.com
curl -I https://example.com

İlk komut 301 ve Location: https://example.com/ döndürmelidir. İkincisi 200 OK vermelidir.

Nginx'e dokunmadan: webroot yöntemi

Yapılandırmayı elle yönetmek istiyorsanız yalnızca sertifikayı alabilirsiniz:

sudo certbot certonly --webroot -w /var/www/example.com/html \
  -d example.com -d www.example.com

Sonra sertifika yollarını kendiniz yazarsınız. Bir sonraki bölümdeki yapılandırma bu yöntemle de uyumludur.

5. HTTP→HTTPS Yönlendirme ve Güvenli TLS Ayarları

Certbot'un yazdığı varsayılanlar makul seviyededir. Yine de ne yazıldığını bilmek ve gerekirse elle düzenlemek iyi olur. Aşağıdaki yapılandırma, Mozilla'nın "intermediate" profilini temel alır.

# HTTP: her şeyi HTTPS'e yönlendir
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

# www → non-www (HTTPS)
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;                       # Nginx 1.25.1+; eski sürümde: listen 443 ssl http2;
    server_name example.com;

    root /var/www/example.com/html;
    index index.html;

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

    ssl_protocols TLSv1.2 TLSv1.3;
    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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

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

    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        try_files $uri $uri/ =404;
    }
}

Önemli noktalar:

Değişiklikten sonra:

sudo nginx -t && sudo systemctl reload nginx

6. Otomatik Yenileme

Let's Encrypt sertifikaları 90 gün geçerlidir. Certbot, süresi 30 günden az kalan sertifikaları yeniler. Snap kurulumunda bir systemd zamanlayıcısı hazır gelir. Kontrol edin:

systemctl list-timers | grep certbot

Depo paketinde certbot.timer veya /etc/cron.d/certbot bulunur. Hangisinin etkin olduğuna bakın.

Yenilemeyi gerçek sertifikayı etkilemeden deneyin:

sudo certbot renew --dry-run

Çıktının sonunda Congratulations, all simulated renewals succeeded görmelisiniz.

Nginx eklentisi yenilemeden sonra Nginx'i kendisi yeniden yükler. Sertifikayı certonly ile aldıysanız bir deploy hook ekleyin:

sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh > /dev/null <<'EOF'
#!/bin/sh
systemctl reload nginx
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

7. Doğrulama

Sertifika bitiş tarihini komut satırından görebilirsiniz:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -issuer -dates

Protokol desteğini test edin:

openssl s_client -connect example.com:443 -tls1_2 < /dev/null
openssl s_client -connect example.com:443 -tls1_3 < /dev/null

Harici bir tarama aracıyla (ör. Qualys SSL Labs) genel değerlendirme de alabilirsiniz.

Yaygın Hatalar ve Çözümleri

Hata Neden Çözüm
Timeout during connect (likely firewall problem) 80 portu kapalı veya DNS yanlış IP'yi gösteriyor Güvenlik duvarını ve bulut firewall kurallarını kontrol edin, dig ile DNS'i doğrulayın
Invalid response ... 404 İstek başka bir server block'a düşüyor server_name değerini kontrol edin, nginx -T ile çakışan blokları arayın
AAAA kaydı sorunu IPv6 kaydı var ama sunucu IPv6'da dinlemiyor listen [::]:80; ekleyin veya AAAA kaydını silin
too many certificates / rate limit Kısa sürede çok fazla deneme Denemeleri --dry-run veya --staging ile yapın, limit süresini bekleyin
Could not automatically find a matching server block Nginx'te alan adına ait server_name yok Server block'ı oluşturup -d ile aynı adı yazın
Yenileme sessizce başarısız 80 portu sonradan kapatılmış veya yönlendirme .well-known yolunu engelliyor certbot renew --dry-run çalıştırın, /.well-known/acme-challenge/ yoluna erişimi açık bırakın
Wildcard (*.example.com) alınamıyor HTTP-01 wildcard'ı desteklemez DNS-01 doğrulaması kullanın: certbot certonly --manual --preferred-challenges dns veya DNS sağlayıcınızın eklentisi

CDN ya da ters proxy arkasındaysanız sertifika doğrulaması proxy üzerinden geçebilir. Gerekirse kaynak sunucuya ait IP'ye doğrudan erişimi test edin veya DNS-01 yöntemini tercih edin.

Kısa Kontrol Listesi

Altyapı Notu

SSL/TLS, trafiği şifreler ve kimliği doğrular. Hacimsel saldırılara (L3/L4) karşı koruma sağlamaz. Herkese açık bir web sitesi yayınlıyorsanız ağ seviyesinde koruma da planlayın. Nixcon'un İzmir veri merkezindeki BGP destekli VDS sunucularında Nginx ve certbot'u bu rehberdeki adımlarla kurabilirsiniz. Ağ katmanındaki saldırılar için DDoS koruma ve firewall seçeneklerine de bakabilirsiniz.

Sık sorulan sorular

Let's Encrypt sertifikası ne kadar süre geçerli?

90 gün geçerlidir. Certbot, bitişine 30 günden az kalan sertifikaları otomatik yeniler. Zamanlayıcının çalıştığını `systemctl list-timers | grep certbot` ile, yenilemenin sorunsuz olduğunu `certbot renew --dry-run` ile doğrulayabilirsiniz.

Certbot sertifikayı yeniledi ama site eski sertifikayı gösteriyor, neden?

Nginx yeni sertifikayı yeniden yüklemeden kullanmaz. `--nginx` eklentisi bunu kendisi yapar. `certonly` veya `--webroot` kullandıysanız /etc/letsencrypt/renewal-hooks/deploy/ altına `systemctl reload nginx` çalıştıran bir hook ekleyin.

Wildcard sertifika nasıl alınır?

Wildcard sertifikalar yalnızca DNS-01 doğrulamasıyla alınır. DNS sağlayıcınızın certbot eklentisini kullanmak yenilemeyi otomatikleştirir. `--manual` yöntemi ise her yenilemede elle TXT kaydı eklemenizi gerektirir.

HSTS'yi hemen uzun süreyle açmalı mıyım?

Hayır. Önce `max-age=300` gibi kısa bir değerle başlayın ve tüm sayfaların HTTPS ile çalıştığını doğrulayın. Sorun yoksa süreyi kademeli artırın. `includeSubDomains` yalnızca tüm alt alan adları HTTPS destekliyorsa eklenmelidir.

Nginx ve SSL'i kendi VDS'inizde kurmaya Nixcon altyapısıyla başlayın.İncele