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
- Root veya sudo yetkisi olan bir Linux sunucu (VDS veya fiziksel sunucu).
- Alan adınızın A kaydı (varsa AAAA kaydı) sunucunun genel IP'sini göstermeli:
example.com → 192.0.2.10,www.example.com → 192.0.2.10. - 80 ve 443 portları internete açık olmalı. Let's Encrypt, alan adı doğrulamasını 80 portundan HTTP-01 yöntemiyle yapar.
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:
- Let's Encrypt'e hesap açar ve alan adı doğrulamasını başlatır.
- Sertifikayı
/etc/letsencrypt/live/example.com/altına yazar. - Nginx yapılandırmanıza
listen 443 sslve sertifika yollarını ekler. --redirectile 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:
- TLS 1.0 ve 1.1 kapalı. Yalnızca TLS 1.2 ve 1.3 açıktır. Bugün neredeyse tüm istemciler bunları destekler.
- HSTS dikkatli açılmalı. Tarayıcılar bu başlığı gördükten sonra siteye süre boyunca yalnızca HTTPS ile bağlanır. Önce
max-age=300gibi kısa bir değerle test edin. Her şey doğruysa artırın.includeSubDomainseklemeden önce tüm alt alan adlarınızın HTTPS desteklediğinden emin olun. - OCSP stapling'e ihtiyacınız yok. Let's Encrypt, OCSP hizmetini kapattığı için sertifikalarda artık OCSP adresi bulunmaz.
ssl_stapling oneklemeniz gerekmez. Başka bir CA kullanıyorsanız durum farklı olabilir. - Eski
ssl_dhparamzorunlu değil. Yukarıdaki şifre listesi ECDHE ağırlıklıdır. Certbot'un eklediğioptions-ssl-nginx.confvessl-dhparams.pemdosyalarını kullanıyorsanız onlara dokunmanız gerekmez.
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
- DNS kayıtları sunucu IP'sini gösteriyor.
- 80 ve 443 açık.
nginx -thatasız.certbot renew --dry-runbaşarılı.- HTTP istekleri 301 ile HTTPS'e gidiyor.
- TLS 1.2/1.3 açık, eski protokoller kapalı.
- HSTS kısa süreyle test edildi, sonra artırıldı.
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.