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.