Sunucuna SSL sertifikası kurmak artık eskisi kadar zahmetli ve pahalı değil. Let’s Encrypt, 2015’ten bu yana ücretsiz, otomatik ve açık kaynaklı sertifikalar sunarak web’i daha güvenli bir yer haline getiriyor. Ubuntu sunucunda Certbot aracılığıyla Let’s Encrypt kurulumu yapmak, hem deneyimli sysadminler hem de işe yeni başlayanlar için oldukça pratik bir süreç. Bu yazıda sıfırdan başlayarak, yaygın hata senaryolarını da ele alarak tam bir kurulum rehberi hazırladım.
Let’s Encrypt ve Certbot Nedir?
Let’s Encrypt, Internet Security Research Group (ISRG) tarafından yönetilen, ücretsiz SSL/TLS sertifikaları veren bir Sertifika Otoritesi’dir (CA). Geleneksel sertifika otoritelerinden farklı olarak bu süreci tamamen otomatikleştiriyor ve sertifika başına hiçbir ücret almıyor.
Certbot ise Electronic Frontier Foundation (EFF) tarafından geliştirilen, Let’s Encrypt sertifikalarını almanızı ve otomatik olarak yenilemenizi sağlayan resmi istemci yazılımıdır. Apache, Nginx, HAProxy gibi popüler web sunucularıyla entegre çalışır.
Pratikte ne anlama geliyor? Müşterinizin yeni e-ticaret sitesini aldınız, sunucu kurulumu tamam, domain yönlendirildi, şimdi HTTPS lazım. Yıllık 50-200 dolar ödemek yerine 10 dakikada ücretsiz sertifikayı alıp yapılandırabilirsiniz.
Ön Gereksinimler
Kuruluma başlamadan önce birkaç şeyin hazır olması gerekiyor:
- Ubuntu 20.04, 22.04 veya 24.04 çalışan bir sunucu
- Root ya da sudo yetkisi olan bir kullanıcı
- Sunucuya yönlendirilmiş bir domain adı (A kaydı sunucunun IP’sini göstermeli)
- 80 ve 443 portlarının açık olması
- Apache ya da Nginx kurulu ve çalışıyor olması
Domain yönlendirmesini kontrol etmek için:
dig +short senindomain.com
# ya da
nslookup senindomain.com
Çıktının sunucunun gerçek IP adresiyle eşleşmesi gerekiyor. DNS henüz yayılmadıysa Certbot HTTP-01 challenge’ını geçemez ve sertifikayı alamazsınız.
Certbot Kurulumu
Ubuntu 20.04 ve Sonrası için Snap ile Kurulum
EFF, Certbot’un Snap paketi üzerinden kurulmasını öneriyor. Bu yöntem her Ubuntu sürümünde tutarlı ve güncel sürümü garanti ediyor.
# Önce varsa eski certbot paketini temizleyelim
sudo apt remove certbot
# Snap'in güncel olduğundan emin olalım
sudo snap install core
sudo snap refresh core
# Certbot'u snap ile kuralım
sudo snap install --classic certbot
# Certbot komutunu PATH'e ekleyelim
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Kurulumu doğrulamak için:
certbot --version
APT ile Kurulum (Alternatif Yöntem)
Bazı durumlarda snap kullanamıyor olabilirsiniz, örneğin LXC container’larında veya kısıtlı ortamlarda. Bu durumda APT deposunu kullanabilirsiniz:
sudo apt update
sudo apt install certbot python3-certbot-nginx
# Apache kullanıyorsanız:
# sudo apt install certbot python3-certbot-apache
Nginx ile SSL Sertifikası Alma
Otomatik Yapılandırma
Certbot’un en güzel özelliği, Nginx veya Apache konfigürasyonunu otomatik olarak düzenleyebilmesi. Tek komutla hem sertifikayı alıyor hem de web sunucusu ayarlarını yapıyor:
sudo certbot --nginx -d senindomain.com -d www.senindomain.com
Komut çalıştığında Certbot senden birkaç şey isteyecek:
- E-posta adresi (acil durum bildirimleri ve sertifika yenileme hatırlattıkları için)
- ACME anlaşması onayı
- EFF e-posta listesine katılmak isteyip istemediğin
Başarılı çıktı şöyle görünür:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/senindomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/senindomain.com/privkey.pem
This certificate expires on 2024-09-15.
Manuel Nginx Yapılandırması
Otomatik yapılandırmayı sevmiyorsanız veya mevcut konfigürasyonunuzun bozulmasından çekiniyor iseniz, sertifikayı alıp Nginx ayarlarını kendiniz yapabilirsiniz.
Önce sadece sertifikayı alalım:
sudo certbot certonly --nginx -d senindomain.com -d www.senindomain.com
Sonra /etc/nginx/sites-available/senindomain.com dosyanızı şu şekilde düzenleyin:
server {
listen 80;
server_name senindomain.com www.senindomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name senindomain.com www.senindomain.com;
ssl_certificate /etc/letsencrypt/live/senindomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/senindomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/senindomain.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Yapılandırmayı test edip Nginx’i yeniden yükleyin:
sudo nginx -t
sudo systemctl reload nginx
Apache ile SSL Sertifikası Alma
Apache kullananlar için süreç benzer, sadece plugin değişiyor:
sudo certbot --apache -d senindomain.com -d www.senindomain.com
Certbot, Apache’nin sanal host dosyalarını otomatik olarak bulup SSL yönlendirmesini ekleyecek. Eğer manuel yapmak istiyorsanız, /etc/apache2/sites-available/senindomain.com-ssl.conf dosyası oluşturun:
<VirtualHost *:443>
ServerName senindomain.com
ServerAlias www.senindomain.com
DocumentRoot /var/www/senindomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/senindomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/senindomain.com/privkey.pem
# Güvenli SSL ayarları
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=63072000"
</VirtualHost>
Standalone Mod: Web Sunucusu Olmadan Sertifika Alma
Bazen web sunucusu kurulmadan önce sertifika almak gerekebilir. Ya da bir port çakışması sorununuz vardır. Bu durumda standalone modu kullanın:
# Önce 80. portu kullanan servisi geçici durdur
sudo systemctl stop nginx
# Standalone modda sertifika al
sudo certbot certonly --standalone -d senindomain.com -d www.senindomain.com
# Web sunucusunu tekrar başlat
sudo systemctl start nginx
Standalone mod kendi küçük web sunucusunu ayağa kaldırır, Let’s Encrypt’in doğrulama isteğini yanıtlar ve işi biter bitmez kapanır.
Wildcard Sertifika Alma
Birden fazla subdomain için ayrı ayrı sertifika almak yerine tek bir wildcard sertifika kullanabilirsiniz. *.senindomain.com şeklinde bir sertifika, app.senindomain.com, api.senindomain.com, mail.senindomain.com gibi tüm alt domainleri kapsar.
Wildcard sertifikalar için DNS-01 challenge kullanmak zorundasınız:
sudo certbot certonly --manual --preferred-challenges dns
-d senindomain.com -d "*.senindomain.com"
Certbot size şuna benzer bir şey gösterecek:
Please deploy a DNS TXT record under the name:
_acme-challenge.senindomain.com
with the following value:
xK2mNpQ8rT4vW7yZ1aB3cD5eF6gH9iJ0
Bu TXT kaydını DNS yönetim panelinizden eklemeniz ve yayılmasını beklemeniz gerekiyor. Kaydın eklenip eklenmediğini şöyle kontrol edebilirsiniz:
dig +short TXT _acme-challenge.senindomain.com
Çıktıda istenen değeri gördükten sonra Certbot’ta Enter’a basarak devam edin.
Sertifika Yenileme
Let’s Encrypt sertifikaları 90 günde bir yenilenmesi gerekiyor. Certbot bu işi otomatik yapacak şekilde sisteme kendini entegre ediyor.
Otomatik Yenileme Kontrolü
Snap ile kurduysanız, Certbot bir systemd timer servisi oluşturur:
sudo systemctl status snap.certbot.renew.timer
APT ile kurduysanız bir cron job oluşturulur:
cat /etc/cron.d/certbot
Genellikle günde iki kez çalışır ve sona ermeye 30 günden az kalan sertifikaları yeniler.
Yenilemeyi Manuel Test Etmek
Gerçekten yenileme yapmadan önce test etmek için:
sudo certbot renew --dry-run
Bu komut tüm süreci simüle eder ama DNS kaydı ya da sertifika dosyası oluşturmaz. Çıktıda hata yoksa yenileme otomatik olarak çalışacak demektir.
Yenileme Sonrası Hook
Sertifika yenilendiğinde Nginx veya Apache’nin yeniden yüklenmesi gerekiyor. Certbot bunu deploy hook’larıyla halleder:
# Hook dosyası oluştur
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Dosya içeriği:
#!/bin/bash
systemctl reload nginx
Dosyayı çalıştırılabilir yapın:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Artık her sertifika yenilemesinden sonra Nginx otomatik olarak yeniden yüklenecek.
Sertifika Durumunu İzleme
Mevcut sertifikalarınızın durumunu görmek için:
sudo certbot certificates
Çıktı şöyle görünür:
Found the following certs:
Certificate Name: senindomain.com
Serial Number: 4a7b2c...
Key Type: ECDSA
Domains: senindomain.com www.senindomain.com
Expiry Date: 2024-09-15 12:00:00+00:00 (VALID: 75 days)
Certificate Path: /etc/letsencrypt/live/senindomain.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/senindomain.com/privkey.pem
Yaygın Hatalar ve Çözümleri
Port 80 Erişim Sorunu
Let’s Encrypt’in HTTP-01 doğrulaması için 80. porta erişmesi şart. Firewall bunu engelliyorsa:
# UFW kullanıyorsanız
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
# iptables kullanıyorsanız
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Rate Limit Hatası
Let’s Encrypt’in sınırlamaları var: Aynı domain için haftada 5 sertifika. Test aşamasında sürekli deneme yapıp bu limiti aşmamak için --staging bayrağını kullanın:
sudo certbot --nginx --staging -d senindomain.com
Staging ortamı gerçek sertifika vermez ama süreci test etmenizi sağlar. Her şey yolunda gidince staging olmadan tekrar çalıştırın.
“Too many certificates already issued” Hatası
Bu hatayı aldıysanız ya haftayı beklemeniz ya da Let’s Encrypt’in Duplicate Certificate politikasından yararlanmanız gerekiyor. Tamamen aynı domain kombinasyonu için yeni sertifika alınabilir ama bu da limitlidir.
Nginx Konfigürasyon Çakışması
Bazen Certbot mevcut Nginx konfigürasyonuyla çakışabilir. nginx -t çalıştırıp hangi satırda hata olduğunu görün:
sudo nginx -t 2>&1
Hata genellikle mükerrer ssl_certificate direktiflerinden kaynaklanır. Eski SSL ayarlarını temizleyip Certbot’u tekrar çalıştırın.
Güvenlik Sıkılaştırması
SSL sertifikasını aldıktan sonra birkaç ek adım güvenliği önemli ölçüde artırıyor.
SSL Labs Testini Çalıştırın
ssllabs.com/ssltest adresine gidip domaininizi test edin. A+ almak hedefiniz olmalı. Genellikle modern cipher suite ayarları ve HSTS header’ı bunu sağlar.
HSTS Header Eklemek
HTTP Strict Transport Security, tarayıcıların sitenize her zaman HTTPS üzerinden bağlanmasını zorunlu kılar. Nginx’te:
sudo nano /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
Bu dosyayı server bloğunuzda include edin:
server {
listen 443 ssl http2;
include /etc/nginx/snippets/ssl-params.conf;
# diğer ayarlar...
}
Çoklu Domain Yönetimi
Yönettiğiniz sunucuda onlarca site varsa her birini tek tek yönetmek zahmetli. Certbot tüm sertifikaları listeler ve toplu yenileme yapar:
# Tüm sertifikaları yenile
sudo certbot renew
# Sadece belirli bir sertifikayı yenile
sudo certbot renew --cert-name senindomain.com
# Mevcut sertifikaya yeni domain ekle
sudo certbot --nginx -d senindomain.com -d www.senindomain.com -d api.senindomain.com
Bir sertifikayı silmek için:
sudo certbot delete --cert-name senindomain.com
Gerçek Dünya Senaryosu: WordPress Sitesi için Tam Kurulum
Müşteri sitesi devreye alıyorsunuz diyelim. Domain yönlendirildi, Ubuntu 22.04 üzerinde Nginx ve PHP-FPM var. İşte adım adım:
# 1. Certbot kur
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 2. Nginx'in çalıştığını doğrula
sudo systemctl status nginx
# 3. Sertifikayı al ve Nginx'i otomatik yapılandır
sudo certbot --nginx -d musterisitesi.com -d www.musterisitesi.com
--email [email protected]
--agree-tos
--non-interactive
# 4. Yenilemeyi test et
sudo certbot renew --dry-run
# 5. Sertifika durumunu kontrol et
sudo certbot certificates
--non-interactive bayrağı sayesinde script içinde kullanabilir, interaktif soru sormadan sertifikayı alabilirsiniz. Bu özellik özellikle Ansible ya da bash automation scriptleri yazarken hayat kurtarıcı.
Monitoring ve Uyarı Sistemi
Sertifika süresini izlemek için basit bir monitoring scripti yazabilirsiniz:
#!/bin/bash
# /usr/local/bin/check-ssl-expiry.sh
DOMAIN="senindomain.com"
THRESHOLD=30
EXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $THRESHOLD ]; then
echo "UYARI: $DOMAIN sertifikası $DAYS_LEFT gün içinde sona eriyor!" |
mail -s "SSL Sertifika Uyarisi" [email protected]
fi
Bu scripti cron’a ekleyin:
sudo crontab -e
# Her sabah 9'da çalıştır
0 9 * * * /usr/local/bin/check-ssl-expiry.sh
Sonuç
Let’s Encrypt ve Certbot ikilisi, SSL sertifikası yönetimini gerçekten basit ve erişilebilir hale getirdi. Bir zamanlar sertifika işlemleri için CA ile yazışmak, DV doğrulama beklemek ve yıllık ödeme yapmak gerekiyordu. Artık tek bir komutla tüm süreci tamamlamak mümkün.
Dikkat edilmesi gereken birkaç kritik nokta var: DNS yönlendirmesinin hazır olduğundan emin olmadan başlamayın, test aşamalarında --staging bayrağını kullanın, yenileme hook’larını eksiksiz yapılandırın ve --dry-run ile periyodik testler yapın. Sertifika yenileme başarısız olduğunda genellikle mail gelir ama buna güvenmek yerine aktif monitoring kurmak her zaman daha iyi.
Sunucunuzda onlarca site yönetiyorsanız Certbot’un toplu yenileme özelliği ve renewal hook’ları gerçekten işleri kolaylaştırıyor. Bir kez doğru kurulumu yaptıktan sonra sertifika konusunu tamamen unutabilirsiniz ki sysadmin hayatında bu küçük bir nimettir.