Let’s Encrypt ile Ücretsiz SSL Sertifikası Kurulumu

Web sunucunuzu HTTPS ile korumanın önemi artık tartışılmaz bir gerçek. Tarayıcılar HTTP bağlantıları için “Güvenli Değil” uyarısı gösteriyor, Google arama sıralamalarında HTTPS sitelerini öne çıkarıyor ve kullanıcılar artık adres çubuğundaki o küçük kilide bakıyor. Peki ya SSL sertifikası için yıllık yüzlerce dolar ödemek zorunda mısınız? Kesinlikle hayır. Let’s Encrypt, ücretsiz, otomatik ve açık bir sertifika otoritesi olarak bu sorunu tamamen çözüyor.

Bu yazıda Let’s Encrypt’i sıfırdan kurmayı, Nginx ve Apache ile entegrasyonu, wildcard sertifikaları ve otomatik yenileme mekanizmalarını gerçek dünya senaryolarıyla birlikte ele alacağız.

Let’s Encrypt Nedir ve Nasıl Çalışır?

Let’s Encrypt, Internet Security Research Group (ISRG) tarafından yönetilen, tarayıcılar tarafından güvenilen bir sertifika otoritesidir. 2016’dan bu yana milyonlarca domain için ücretsiz SSL sertifikası sağlıyor. Certbot ise Let’s Encrypt’in resmi istemcisi olup sertifika alma, kurma ve yenileme işlemlerini otomatize ediyor.

Let’s Encrypt, domain sahipliğini doğrulamak için ACME (Automated Certificate Management Environment) protokolünü kullanır. Temel doğrulama yöntemleri şunlardır:

  • HTTP-01 Challenge: .well-known/acme-challenge/ dizinine geçici bir dosya yerleştirerek domain sahipliğini kanıtlar
  • DNS-01 Challenge: DNS TXT kaydı ekleyerek doğrulama yapar, wildcard sertifikalar için zorunludur
  • TLS-ALPN-01 Challenge: 443 portu üzerinden TLS handshake ile doğrulama yapar

Sertifikaların geçerlilik süresi 90 gündür. Bu süre kısa gibi görünse de otomatik yenileme sayesinde hiç sorun yaşamazsınız. Aksine kısa süre, ele geçirilmiş sertifikaların etkisini sınırlar.

Ön Hazırlık ve Gereksinimler

Başlamadan önce şunların hazır olması gerekiyor:

  • Sunucuya erişimi olan bir domain adı (DNS A kaydı sunucuya işaret etmeli)
  • 80 ve 443 portlarının açık olduğu bir Linux sunucu
  • Root veya sudo yetkisi
  • Nginx veya Apache kurulu web sunucusu

DNS yayılımını kontrol etmek için:

dig +short yourdomain.com A
nslookup yourdomain.com

Portların açık olduğunu doğrulayın:

sudo ss -tlnp | grep -E ':(80|443)'
sudo ufw status
# veya
sudo firewall-cmd --list-ports

Eğer firewall aktifse gerekli portları açın:

# UFW için
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

# Firewalld için
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Certbot Kurulumu

Ubuntu/Debian Üzerinde

Ubuntu 20.04 ve sonrası için snap paketini öneririm, çünkü her zaman güncel versiyonu kullanırsınız:

# Snap daemon kurulumu
sudo apt update
sudo apt install snapd -y

# Eski certbot varsa temizle
sudo apt remove certbot

# Certbot snap kurulumu
sudo snap install --classic certbot

# Symlink oluştur
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Versiyon kontrolü
certbot --version

Alternatif olarak apt ile de kurabilirsiniz:

sudo apt install certbot python3-certbot-nginx python3-certbot-apache -y

CentOS/RHEL/Rocky Linux Üzerinde

# EPEL reposunu ekle
sudo dnf install epel-release -y

# Certbot kurulumu
sudo dnf install certbot python3-certbot-nginx python3-certbot-apache -y

# Snap alternatifi için
sudo dnf install snapd -y
sudo systemctl enable --now snapd.socket
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Nginx ile SSL Sertifikası Alma

Otomatik Nginx Entegrasyonu

En kolay yöntem, certbot’un nginx konfigürasyonunu otomatik olarak düzenlemesidir:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Bu komut şunları yapar:

  • Domain sahipliğini HTTP-01 challenge ile doğrular
  • Sertifikaları /etc/letsencrypt/live/yourdomain.com/ altına kaydeder
  • Nginx konfigürasyonunu HTTPS için otomatik günceller
  • HTTP’den HTTPS’e yönlendirme ekler

Komut çalıştırıldığında sizden e-posta adresi ve hizmet şartlarını kabul etmenizi isteyecek. Eğer bu adımları interaktif olmadan geçmek istiyorsanız:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com 
  --non-interactive 
  --agree-tos 
  --email [email protected] 
  --redirect

Manuel Nginx Konfigürasyonu

Konfigürasyonu kendiniz yönetmeyi tercih ediyorsanız önce sertifika alın, sonra manuel düzenleyin:

# Sadece sertifika al, nginx'e dokunma
sudo certbot certonly --nginx -d yourdomain.com -d www.yourdomain.com

Sertifika alındıktan sonra Nginx konfigürasyonu /etc/nginx/sites-available/yourdomain.com:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;

    # Güvenlik parametreleri
    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;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_stapling on;
    ssl_stapling_verify on;

    # HSTS (6 ay)
    add_header Strict-Transport-Security "max-age=15768000" always;

    root /var/www/yourdomain.com;
    index index.html index.php;

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

Konfigürasyonu test edip yeniden yükleyin:

sudo nginx -t
sudo systemctl reload nginx

Apache ile SSL Sertifikası Alma

Apache kullanıcıları için de süreç benzer şekilde ilerliyor:

# Apache modüllerini etkinleştir
sudo a2enmod ssl rewrite headers
sudo systemctl restart apache2

# Certbot ile sertifika al ve Apache'yi otomatik yapılandır
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com

Manuel Apache konfigürasyonu /etc/apache2/sites-available/yourdomain.com-ssl.conf:

<VirtualHost *:80>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com
    Redirect permanent / https://yourdomain.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com
    DocumentRoot /var/www/yourdomain.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem

    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder off
    SSLSessionTickets off

    Header always set Strict-Transport-Security "max-age=15768000"

    <Directory /var/www/yourdomain.com>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
sudo a2ensite yourdomain.com-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

Wildcard Sertifika Alma

Wildcard sertifika (*.yourdomain.com) ile tüm alt domainleriniz tek bir sertifikayla korunur. Bu yöntem DNS-01 challenge gerektirir, yani DNS sağlayıcınıza TXT kaydı eklemeniz gerekiyor.

sudo certbot certonly 
  --manual 
  --preferred-challenges dns 
  -d yourdomain.com 
  -d "*.yourdomain.com"

Certbot size şuna benzer bir TXT kaydı ekletecek:

_acme-challenge.yourdomain.com  TXT  "xyzABCdefGHI123..."

Bu kaydı DNS panelinize ekledikten sonra yayılımını kontrol edin:

dig +short TXT _acme-challenge.yourdomain.com
# veya
nslookup -type=TXT _acme-challenge.yourdomain.com 8.8.8.8

TXT kaydı görünür hale gelince certbot’ta Enter’a basarak devam edin.

DNS API ile Otomatik Wildcard

Cloudflare gibi desteklenen DNS sağlayıcıları için bu süreci tamamen otomatize edebilirsiniz:

# Cloudflare DNS eklentisi
sudo snap install certbot-dns-cloudflare
# veya
sudo pip install certbot-dns-cloudflare

Cloudflare API anahtarını kaydedin /etc/letsencrypt/cloudflare.ini:

dns_cloudflare_email = [email protected]
dns_cloudflare_api_key = your_global_api_key_here
# Veya API token kullanıyorsanız (önerilen)
# dns_cloudflare_api_token = your_api_token_here
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

sudo certbot certonly 
  --dns-cloudflare 
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini 
  -d yourdomain.com 
  -d "*.yourdomain.com" 
  --agree-tos 
  --email [email protected] 
  --non-interactive

Sertifika Yenileme ve Otomasyon

Let’s Encrypt sertifikaları 90 günde bir yenilenmeli. Certbot kurulumu bu işi otomatik halleder ama nasıl çalıştığını bilmek önemli.

Mevcut Yenileme Konfigürasyonu Kontrolü

# Sertifika durumunu gör
sudo certbot certificates

# Yenileme testi (gerçekte yenileme yapmaz)
sudo certbot renew --dry-run

# Mevcut timer/cron kontrolü
sudo systemctl status snap.certbot.renew.timer
# veya
sudo cat /etc/cron.d/certbot

Snap ile kurduysanız, systemd timer otomatik oluşturulur:

sudo systemctl list-timers | grep certbot

Manuel Cron ile Yenileme

Eski kurulumlar veya özel senaryolar için cron job’ı kendiniz ekleyebilirsiniz:

sudo crontab -e
# Her gün saat 02:30'da yenileme kontrolü yap
30 2 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

# Alternatif: Ayda iki kez kontrol
0 3 1,15 * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload apache2"

--post-hook parametresi yalnızca başarılı yenileme sonrası çalışır. Web sunucusunu yenilemeden sertifikalar aktif olmaz.

Yenileme Hook’ları

Certbot’un hook sistemi oldukça güçlü. /etc/letsencrypt/renewal-hooks/ altında üç dizin var:

  • pre/: Yenileme denemesinden önce çalışır
  • deploy/: Başarılı yenilemeden sonra çalışır
  • post/: Yenileme denemesinden sonra (başarılı ya da başarısız) çalışır

Örnek bir deploy hook /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh:

#!/bin/bash
# Yenileme sonrası Nginx'i yeniden yükle
systemctl reload nginx

# Opsiyonel: Slack bildirimi gönder
# curl -X POST -H 'Content-type: application/json' 
#   --data '{"text":"SSL sertifikası başarıyla yenilendi: '"$RENEWED_DOMAINS"'"}' 
#   https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

Sertifika Durumu İzleme

Sertifikaların ne zaman dolacağını bilmek kritik. Birkaç farklı yöntemle bunu izleyebilirsiniz.

Certbot ile Kontrol

# Tüm sertifikaları listele
sudo certbot certificates

# Örnek çıktı:
# Found the following certs:
#   Certificate Name: yourdomain.com
#     Domains: yourdomain.com www.yourdomain.com
#     Expiry Date: 2024-12-01 (VALID: 87 days)
#     Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem

OpenSSL ile Sertifika Detayları

# Yerel sertifika bilgisi
sudo openssl x509 -in /etc/letsencrypt/live/yourdomain.com/cert.pem -noout -dates -subject

# Uzak sunucudan sertifika kontrolü
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | 
  openssl x509 -noout -dates -subject -issuer

İzleme Script’i

Birden fazla domaini izlemek için basit bir script:

#!/bin/bash
# /usr/local/bin/ssl-check.sh

DOMAINS=("yourdomain.com" "blog.yourdomain.com" "api.yourdomain.com")
WARNING_DAYS=14
EMAIL="[email protected]"

for domain in "${DOMAINS[@]}"; do
    expiry=$(echo | openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null | 
        openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
    
    if [ -z "$expiry" ]; then
        echo "HATA: $domain için sertifika kontrol edilemedi"
        continue
    fi
    
    expiry_epoch=$(date -d "$expiry" +%s)
    now_epoch=$(date +%s)
    days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
    
    if [ "$days_left" -lt "$WARNING_DAYS" ]; then
        echo "UYARI: $domain sertifikasının süresi $days_left gün içinde doluyor!"
        # Mail gönder
        echo "SSL uyarısı: $domain - $days_left gün kaldı" | 
            mail -s "SSL Sertifika Uyarısı: $domain" "$EMAIL"
    else
        echo "OK: $domain - $days_left gün kaldı"
    fi
done
sudo chmod +x /usr/local/bin/ssl-check.sh
# Haftalık cron'a ekle
echo "0 9 * * 1 /usr/local/bin/ssl-check.sh" | sudo crontab -

Yaygın Sorunlar ve Çözümleri

Rate Limit Sorunları

Let’s Encrypt’in rate limit’leri var: aynı domain için haftada 5 sertifika. Test sırasında --staging flag’ini kullanın:

sudo certbot --nginx -d yourdomain.com --staging

Staging ortamı gerçek sertifika vermez ama konfigürasyonunuzun doğru çalıştığını test eder.

Port 80 Erişim Sorunu

HTTP-01 challenge için port 80 gerekli. Nginx/Apache servisiniz çalışmıyorsa standalone mod kullanın:

# Web sunucusunu durdur
sudo systemctl stop nginx

# Standalone mod ile sertifika al
sudo certbot certonly --standalone -d yourdomain.com

# Web sunucusunu yeniden başlat
sudo systemctl start nginx

Yenileme Başarısız Olduğunda Log Kontrolü

# Certbot logları
sudo tail -100 /var/log/letsencrypt/letsencrypt.log

# Systemd log (snap kurulumu için)
sudo journalctl -u snap.certbot.renew.service -n 50

Gerçek Dünya Senaryosu: WordPress Sitesi

Diyelim ki bir WordPress sitesi kuracaksınız. İşte uçtan uca süreç:

# 1. Nginx ve PHP kurulumu (varsayılan)
sudo apt install nginx php-fpm mysql-server -y

# 2. Certbot ile sertifika al
sudo certbot --nginx -d myblog.com -d www.myblog.com 
  --email [email protected] --agree-tos --non-interactive --redirect

# 3. Nginx konfigürasyonunu WordPress için optimize et
sudo nano /etc/nginx/sites-available/myblog.com

# 4. Yenileme testi
sudo certbot renew --dry-run

# 5. Sertifika durumunu kontrol et
sudo certbot certificates

SSL kurulduktan sonra WordPress admin panelinden Site URL ve WordPress URL değerlerini https:// ile güncelleyin. Ayrıca .htaccess‘e yönlendirme eklemek yerine Nginx konfigürasyonundaki yönlendirmeye güvenin.

SSL Yapılandırması Kalite Testi

Sertifika aldıktan sonra konfigürasyon kalitesini test edin:

# Nmap ile SSL versiyonları
nmap --script ssl-enum-ciphers -p 443 yourdomain.com

# testssl.sh ile kapsamlı analiz
bash <(curl -s https://raw.githubusercontent.com/drwetter/testssl.sh/3.0/testssl.sh) yourdomain.com

Online araçlar için Qualys SSL Labs (ssllabs.com/ssltest) A+ puan almanın standardını belirliyor. İyi bir Nginx yapılandırmasıyla A+ almak çok zor değil.

Sonuç

Let’s Encrypt ve Certbot ikilisi, SSL sertifikası yönetimini gerçek anlamda demokratikleştirdi. Ücretsiz, güvenilir ve otomatik yenileme sayesinde sertifika bakımı sıfıra yakın efor gerektiriyor. Dikkat edilmesi gereken kritik noktaları özetleyelim:

  • Her zaman staging ortamını test edin rate limit sorunlarından kaçınmak için
  • Yenileme hook’larını mutlaka ekleyin yoksa sertifika yenilense bile web sunucusu eski sertifikayı kullanmaya devam eder
  • İzleme script’i kurun otomatik yenileme genellikle çalışır ama “genellikle” yeterli değil
  • Wildcard sertifika gerekiyorsa DNS-01 challenge kullanın ve mümkünse DNS API entegrasyonu yapın
  • SSL Labs testi yapın konfigürasyonunuzun A veya A+ almasını hedefleyin

Sertifikalarınızı aldıktan sonra HTTP Strict Transport Security (HSTS) başlığını eklemeyi ve HSTS Preload listesine girmeyi düşünün. Bu adımlar sitenizi bir üst seviye güvenliğe taşır. Let’s Encrypt gerçekten “set it and forget it” felsefesini SSL dünyasına getirdi ve artık “sertifika parası yok” mazereti geçerli değil.

Yorum yapın