Ubuntu ile Let’s Encrypt SSL Sertifikası Kurulumu

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.

Yorum yapın